快速排序的过程:把比 k 大的移到k的右边,比k小的移到k的左边,然后分别对左边和右边排序。
初混江湖,如有错误,还请指正。另:代码来自mooc课后自己写的,不知此文章是否算原创
#include<cstdio>
#include<iostream>
using namespace std;
void swap(int &a,int &b) //取地址交换 a[i]和a[j]的值;
{
int temp=a;
a=b;
b=temp;
}
void quick_sort(int a[],int start,int end)
{
if(start>=end) return; // 如果 起点和终点 相遇,遍历完毕,结束程序; 这是递归的边界条件
int k=a[start]; // 标记起点
int i=start,j=end; // 函数中会改变start和end,但是递归的时候需要用到,所以此处赋值
while(i!=j) // 当左边的 i,右边的 j 没有相遇的时候
{
while(j>i &&a[j]>=k) // 循环,当a[j]>=k时,不需要交换,所以j往左移
j--; //且每次进行到这里都为 [奇数] 个循环,a[j]始终在k右边
swap(a[i],a[j]); // 上面循环结束的时候,说明位于右边的a[j]<k,需要交换
//交换之后的情况是: i,j所在位置不变,k跑到了右边
while(j>i &&a[i]<=k) // 此时移动左边的 i
i++;
swap(a[i],a[j]); // 上个循环结束之后,找到了有一个需要交换的位置
} //大循环结束,左边 <= k <= 右边
quick_sort(a,start,i-i);
quick_sort(a,i+1,end); //对左,右进行递归排序
}
int main()
{
int i;
int a[10]={1,9,3,7,2,0,8,5,6,4}; //剩下的没什么好解释了
quick_sort(a,0,9);
for(i=0;i<10;i++) printf("%d ",a[i]);
return 0;
}