快速排序,虽然最坏时候的时间复杂度是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;
}
本文介绍了快速排序的基本思想及其实现方法。通过选取一个支点,将数组分为两部分,一部分包含比支点小的元素,另一部分包含比支点大的元素。递归地应用这一过程,最终得到有序数组。
353

被折叠的 条评论
为什么被折叠?



