算法思想:
通过一次排序将待排序对象分割成独立的两部分, 其中一部分对象的关键码均比另一部分对象的关键码小, 再分别对这两部分子序列对象继续进行排序,以达到整个序列有序。
排序过程描述
假设有 n 个待排序的对象{a[0],a[1],…,a[n-1]}
首先任选一个对象 a0作为支点(pivot); 然后调整序列中各个对象的位置;
将所有关键码小于或等于 a[0]的对象排在 a[0]的前面;
将所有关键码大于 a[0]的对象排在 a[0]的后面,即{≤a[0]}:a[0]:{>a[0]}; 以上过程称作一次快速排序。
因为支点已经被变量k保留,所以即使在改变数组中数值的时候,只需要让一个数等于另一个数,并不需要同时改变两个数,只需要在最后让其等于支点即可。
#include <stdio.h>
void quick_sort(int s[], int l, int r)
{
int i, j, k;
if (l < r){
i = j;
j = r;
k = s[i];
while (i < j){
while (i < j && s[j] > k) //从左到右找出第一个小于k的数
j--;
if (i < j)
s[i++] = s[j]; //让s[i]等于从左到右第一个小于k的数,并i++
while (i < j && s[i] < k) //从右到左找出第一个大于k的数
i++;
if (i < j)
s[j--] = s[i]; //让s[j]等于从右到左第一个大于k的数,并j++
}
s[i] = k;
quick_sort(s, l, i - 1);
quick_sort(s, i + 1, r);
}
}
int main(void)
{
int a[]={49,38,65,97,76,13,27};
int l = 0;
int r = 6;
quick_sort(a,l,r);
for(int i=0;i<=r;i++)
printf("%d ",a[i]);
puts("");
return 0;
}