一趟快速排序的算法:
1)设置两个变量I、J,排序开始的时候:I=0,J=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];
3)从J开始向前搜索,即由后开始向前搜索(J=J-1即J--),找到第一个小于key的值A[j],A[j]与A[i]交换;
4)从I开始向后搜索,即由前开始向后搜索(I=I+1即I++),找到第一个大于key的A[i],A[i]与A[j]交换;
5)重复第3、4、5步,直到 I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时 候i, j指针位置不变。另外当i=j这过程一定正好是i+或j-完成的最后令循环结束。)
算法复杂度:O(nlogn)
缺点:严重时会退化到O(n^2),例如选取的关键数据key是最小或最大的。
可以选取合适的关键数据,对下面的实现进行调整和优化。
源代码:
#include<stdio.h>
void QuickSort(int *pData, int left, int right)
{
if(left > right)
return;
int i = left;
int j = right;
int key = *(pData + left);
while(i < j)
{
while(*(pData + j) >= key && i < j)
j--;
if(i < j)
{
//swap *(pData + i) = key
*(pData + i) = *(pData + j);
*(pData + j) = key;
}
while(*(pData + i)<= key && i < j)
i++;
if(i < j)
{
//swap *(pData + j) = key
*(pData + j) = *(pData + i);
*(pData + i) = key;
}
}
//now the i = j,a[i] = key
QuickSort(pData, left, i - 1);
QuickSort(pData, i + 1, right);
}
int main()
{
int i;
int data[10] = {4,3,8,6,2,0,5,8,7,1};
printf("Original:");
for(i = 0; i < 10; i++)
{
printf("%d\t",data[i]);
}
QuickSort(data, 0, 9);
printf("After quick sort:");
for(i = 0; i < 10; i++)
{
printf("%d\t",data[i]);
}
return 0;
}