快速排序设计思想:
- 找一个记录(例如取第一个记录),以它的关键字作为“枢轴”。
- 凡其关键字小于枢轴的记录均移动至该纪录“之前”。
- 凡其关键字大于枢轴的记录均移动至该纪录“之后”。 即对无序的记录序列进行一次划分。
- 之后分别对分割所得两个子序列“递归”进行快速排序,
快速排序的具体分析:
- 设两个下标 i 和 j 。i 标记整个序列的起始位置,j 标记整个序列最后一个元素所在的位置。接着使用一个临时变量,先保存枢轴的值21。
- 保存完毕以后,先从右边找到一个比枢轴的值小的值。如果找到以后,两者之间进行交换。如果未找到,进行 j - 1操作。首先将37与21进行比较,不小,将 j 向前移动,将52与21进行比较,不小,继续将 j 向前移,将8与21比较。此时8小于21,将8和21进行交换。即将8存放在下标为0的位置上。此时j的下标为5.
- 接着从左边开始找到一个比枢轴值大的值,首先进行 i +1 操作。若找到,将两者进行交换,否则进行 i + 1操作。此时25>21,即25应该到 j 所标记的位置。
经过交换后,应该是:
- 下一步继续从右边找到一个比枢轴小的值进行交换;
- 再从左边找到一个比枢轴值大的值进行交换:
- 整个步骤全是右面找一次,左边找一次。直到 i 和 j 相等时 完成一趟快速排序。
- 最后将21的这个值存放在 i 等于 j 的位置上。
- 以上为第一趟快速排序
- 之后分别对两个子序列进行快速排序
快速排序代码如下:
#include<stdio.h>
int a[9]={7,1,2,4,2,5,8,7,9};
int Partition(int low, int high)
{
int pivotkey = a[low]; //枢轴记录关键字
while(low < high) //从两端交替地向中间扫描
{
while(low < high && a[high] >= pivotkey)
high--; //将比枢轴记录小的记录移到低端
a[low]=a[high];
while(low < high && a[low] <= pivotkey)
low++; // 将比枢轴记录大的记录移到高端
a[high]=a[low];
}
a[high] = pivotkey; //枢轴记录到位
return low;
}
void Qsort(int low,int high)
{
if(low < high) //长度 > 1
{
int pivoloc = Partition(low,high); //将其一分为二
Qsort(low,pivoloc-1); //对左半部分进行递归排序,pivoloc是枢轴位置
Qsort(pivoloc+1,high); //对右半部分进行递归排序
}
}
int main()
{
int i;
Qsort(0,8);
for(i=0;i<9;i++)
printf("%d ",a[i]);
return 0;
}