基本思路:
1.将待排序数据存入一维数组中,然后以第一个值为基准值。起初i指向第一个元素,j指向最后一个元素之后的位置。
2.分别从两端遍历数组,直到i所指向的值比基准值大,以及j所指向的值比基准值小时,分别停止遍历,然后交换i,j所指向的值。
3.重复步骤2,直到i >= j,然后交换p和j所指向的值,此时序列别分隔成两部分,基准值右边的值都比基准值大,而左边的元素都比基准值小。
4.分别对左右两部分重复1-4步骤,即可完成排序。(如下图)
代码如下:
void swap(int *x, int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
int Partition(int *A, int p, int r)
{
int i, j, x;
i = p;
j = r + 1;
x = A[p];
while(1)
{
while(A[++i] < x);
while(A[--j] > x);
if(i >= j)
break;
swap(&A[i],&A[j]);
}
A[p] = A[j];
A[j] = x;
return j;
}
void QuickSort(int *A, int p, int r)
{
int q;
if(p < r)
{
q = Partition(A,p,r);
QuickSort(A,p,q-1);
QuickSort(A,q+1,r);
}
}
int main(void)
{
int A[] = {10,3,5,2,8,4,6,7,1,9};
int sum = sizeof(A)/sizeof(int);
QuickSort(A,0,sum-1);
}
冒泡排序时间复杂度为n*(n-1)2: O(n2),是一种稳定的排序。
快速排序时间复杂度为:O(n*log2n),是一种不稳定的排序。
from:http://blog.youkuaiyun.com/gaohuaid/article/details/9128051