4、选择快速排序算法: 快速排序算法的平均时间复杂度低,比较适合大量数据的排序算法,算法的原理如下: 原理:快速排序算法的情况和归并排序算法比较相似!详细原理参考这里:https://www.jianshu.com/p/7631d95fdb0b 时间复杂度:O(n*log(n)) API实现如下: - #define Cutoff 3
- void Swap(int *A, int *B)
- {
- int Temp;
- Temp = *A;
- *A = *B;
- *B = Temp;
- }
- int Median3(int A[], int left, int right) // 寻找枢纽值
- {
- int center = (left + right) / 2;
- int Temp;
- if (A[left] > A[center])
- Swap(&A[left], &A[center]);
- if (A[left] > A[right])
- Swap(&A[left], &A[right]);
- if (A[center] > A[right])
- Swap(&A[center], &A[right]);
- Swap(&A[center], &A[right - 1]); // 将枢纽值保存在数组的边缘
- return A[right - 1]; // return pivot-返回枢纽值
- }
- void QSort(int A[], int left, int right)
- {
- int i, j;
- int pivo;
- if (left + Cutoff <= right) { // 小数组的处理交给插值排序的方法,速度比较快一些
- pivo = Median3(A, left, right); // 枢纽值求解
- i = left; j = right - 1;
- for (;;)
- {
- while (A[++i] < pivo) { } // 分割策略
- while (A[--j] > pivo) { } // 分割策略
- if (i < j)
- Swap(&A[i], &A[j]);
- else
- break;
- }
- Swap(&A[i], &A[right - 1]); // Swap函数属于外部调用,为了提高算法的效率可以直接显式写出代码,不用callSwap函数
- QSort(A, left, i-1); // 分割之后的递归调用
- QSort(A, i+1, right); // 分割之后的递归调用
- }
- else {
- InsertSort(A + left, right - left + 1); // 插值排序算法
- }
- }
- void QuickSort(int A[], int N)
- {
- QSort(A, 0, N-1);
- }
|