快速排序
是对气泡排序的一种改进,思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以此达到整个序列有序。
具体做法为:先将枢轴记录存起来,附设两个指针low和high,初值分别为low high,设枢轴记录的关键字为pivotkey,则首先从high所指位置起向前搜索找到第一个小于pivotkey的关键字记录移到低端,然后从low 所指位置起向后搜索,找到关键字大于pivotkey 的记录移动到高端,重复这两步骤直至low=high,一趟排序后将枢轴记录移到关键的位置。在这里插入代码片
#include<stdio.h>
int partion(int b[], int low, int high);
void quick_sort(int b[], int low,int high);
int main()
{
int length = 0;
int a[10] = {15,100,49,24,43,1000,4355,3,344,67};
length = sizeof(a) / sizeof(int);
quick_sort(a,0,length-1);
for(int i = 0;i < length; ++i)
{
printf("a[%d] is %d\n",i , a[i]);
}
return 0;
}
void quick_sort(int b[], int low,int high)
{
//对顺序表b 中的子序列b[low..high]作快速排序
int pivotloc = 0;
if(low < high)
{
pivotloc = partion(b, low, high); // 将b[low..high]一分为二
quick_sort(b, low, pivotloc-1); // 对低子表递归排序,pivotloc 是枢轴位置
quick_sort(b, pivotloc+1, high); //对高字表递归排序
}
}
int partion(int b[], int low, int high)
{
//交换顺序表L中字表b[low..high]的记录,使枢轴记录到位,并返回其所在位置
//此时在它之前(后)的记录均不大(小)于它。
int temp = b[low]; //用子表的第一个记录作枢轴记录
int pivotkey = b[low]; //枢轴记录关键字
while(low < high) //从表的两端交替的向中间进行扫描
{
while(low <high && b[high] >= pivotkey)
--high;
b[low] = b[high]; //将比枢轴小的记录移到低端
while(low < high && b[low] <= pivotkey)
++low;
b[high] = b[low]; //将比枢轴大的记录移到高端
}
b[low] = temp; //枢轴记录到位
return low; //返回枢轴位置
}
运行结果:
[Running] cd "d:\vscodec\" && g++ test0910.cpp -o test0910 && "d:\vscodec\"test0910
a[0] is 3
a[1] is 15
a[2] is 24
a[3] is 43
a[4] is 49
a[5] is 67
a[6] is 100
a[7] is 344
a[8] is 1000
a[9] is 4355
[Done] exited with code=0 in 0.49 seconds