排序

获取随机数,用于测试排序

需包含 stdlib.htime.h

int * getrand(int min, int max, int len)
{
    int* arr = (int*)malloc(sizeof(int)*len);
    srand(time(NULL));

    for(int i=0; i<len; ++i) {
        arr[i] = rand()%(max-min+1) + min;
        printf("%d ",arr[i]);
    }
    printf("
");
    return arr;
}
  • 冒泡:基本不用,太慢,要两两交换次数太多。
  • 选择:基本不用,慢而且不稳。
  • 插入:样本小且基本有序的时候效率较高。

冒泡排序

void bubbleSort(int a[], int n)
{
    for(bool sorted=false; !sorted; --n) {
        sorted = true; // 每趟循环前都假定已经排序
        for(int i=1; i<n; ++i)
            if(a[i-1] > a[i]) { // 一旦相邻元素是逆序
                swap(a[i-1],a[i]);
                sorted = false; // 发现局部逆序,显然不是排序好的
            }
    }
}

选择排序

最好和最差都是 (O(n^2)) 不稳定

void selectionSort(int *arr,int len)
{
    int minPos = 0;
    for(int i=0;i<len-1;i++) {
        minPos = i;  // 内层开始先假设最小值在外层起始处
        for(int j=i+1;j<len;j++) // 不断地做比较,如果有更小地就更新最小值地位置
            minPos = arr[j] < arr[minPos] ? j : minPos; 
        // 每一趟下来总是可以选出最小值的位置,然后和最前面的进行交换
        swap(arr,i,minPos);
    }
}

插入排序

void insertionSort(int * arr,int n) 
{
    for(int i=1; i<n; i++) { //从第二个位置开始
        for(int j=i; j>0 && arr[j]<arr[j-1]; j--)
            swap(arr,j,j-1); //如果该位置比前面的小,就不断挪(即插入)到前面合适位置
    }
}

先挪出空位置,再插入

void insertionSort2(int * arr,int n) 
{
    int tmp,j;
    for(int i=1; i<n; i++) { //从第二个位置开始
        if(arr[i] < arr[i-1]) {
            tmp = arr[i];   // 保存位置
            for(j=i; j>0 && arr[j-1]>tmp; j--)
                arr[j] = arr[j-1]; //前面地值比tmp大的则后挪
            arr[j] = tmp; // 空出来的位置插入tmp
        }
    }
}

快速排序

void q_sort(int v[], int left, int right) 
{
	if(left >= right)   // 若数组包含的元素少于两个
		return ;
	int last = left;	// 设左边元素为子集划分元素
	for(int i=left+1; i<=right; i++) // 划分子集
		if(v[i] < v[left])
			swap(v, ++last, i);
	swap(v, left, last);			//回复划分子集的元素
	q_sort(v,left,last-1);
	q_sort(v,last+1,right);
}
原文地址:https://www.cnblogs.com/wjundong/p/11570036.html