快速排序,虽然最坏时候的时间复杂度是O(n*n),但是平均时间复杂度是O(nlogn),所以快排是一个效率蛮高的排序方法。
下面可以参考一下实现
/// // 文件名称: qSort.c // 功能:实现简单的快排 // // 快排的基本思想是, 在数组中,选定某一元素为支点, 将 // 将小于该支点的数排在该数的左边, 大于该支点的数排在它右边 // 这样此支点就找到了自己的正确的位置。反复迭代,就直到完全排好序 // // 参考算法导论 (对于partition, 算法导论和 数据结果上略微有点不同同) /// #include <stdio.h> /// // 功能描述: 在数组A中, 将下标为q到r的部分进行操作, 使得以 A[r]为支点 // 将大于A[r]排在它的左边, 小于A[r]的放在它的右边 // 输入参数: // A: 指向数组的指针 // q: 操作的起始下标 // r: 操作的数组的终止下标 // 输出参数: // 无 // 返回值: // A[r] 即支点的新位置 /// int partition(int *A, int q, int r) { if (q>r) return -1; int i = 0, j = 0, temp = 0, x = 0; i = q - 1; //记录当前小于A[r]的数中,最右边那个数的位置 j = q; //遍历 A[q] 到 A[r]的变量 x = A[r]; //记录支点 for (j=q; j<r; j++){ if (A[j]<x){ //因A[i]是最右边的小于x的, A[i+1]>=x //所以此时 A[i+1]和 A[j]进行交换, 让小于x的放在一起 i++; temp = A[i]; A[i] = A[j]; A[j] = temp; } } //for 循环结束后, A[p]到A[r-1]已经被分开了, //其中A[q] 到A[i]是小于 x(A[r])的, A[i+1]到A[r-1]是不小于x //所以,接下来, 应该??? A[r] 和 A[i+1] 交换 i++; temp = A[i]; A[i] = x; A[r] = temp; return i; //返回 A[r]的位置 } //递归进行排序 void qSort(int *A, int q, int r) { int pivot = 0; pivot = partition(A, q, r); //使A[r]恢复到正确的位置 if (pivot == -1) return ; qSort(A, q, pivot-1); //依次将 A[q]--A[pivot-1]排好序 qSort(A, pivot+1, r); } //main函数测试 int main() { int A[10] = {40, 30, 20, 60, 90, 80, 10, 50, 70, 1}; qSort(A, 0, 9); int i = 0; for (i=0; i<10; i++){ printf("%d", A[i]); if (i<9) printf("\t"); } printf("\n"); return 0; }