快速排序(Quicksort)是对冒泡排序的一种改进
基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小(相当于找到一个中间值,这个中间值的左边数据都比它小,右边都比它大),然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
数据分割:
设一维数组Array[l…h],初始时候将其分割为两部分Array[l…r]和Array[r…h];
设置一基准值Array[i],一般我们设为数组首元素即Array[0];
设置两个下标变量i=0,j=h,让j从j-1开始向左边扫描,直到遇到比基准值]小的数Array[j],交换两个数据,此时基准值左边数为比自己小的数,然后i从i+1处向右边扫描,直到遇到比基准值大的数Array[i],交换两个数据,此时基准值右边的数为比自己大的数。
一趟快速排序的算法:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作中间数据,赋值给median,即median=Array[0];
3)从j开始向左边界搜索,即由后开始向前搜索(j–),找到第一个小于median的值Array[j],将Array[j]和Array[i]互换;(Array+i)=(Array+j);
4)从i开始向右边界搜索,即由前开始向后搜索(i++),找到第一个大于median的Array[i],将Array[i]和Array[j]互换;(Array+j)=(Array+i);
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中Array[j]不小于median,4中Array[i]不大于median的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)
实现代码:
#include <stdio.h>
int Partition(int *Array,int i,int j);
int Quicksort(int *Array,int l,int h);
int main()
{
int i,n;
int Array[255];
printf("请输入数据个数:");
scanf("%d",&n);
if(n<=0||n>255)
{
printf("输入数据不正确!\n");
exit(1);
}
printf("请依次输入待排序数据:\n");
for(i=1;i<=n;i++)
scanf("%d",(Array+i));
printf("\n快速排序后结果:\n");
Quicksort(Array,1,n);
for(i=1;i<=n;i++)
printf("%d",*(Array+i));
printf("\n");
}
//快速排序分割算法
//*Array:待排序数组;
//i,j:数组左右边界
int Partition(int *Array,int i,int j)
{
int median;
median=*(Array+i);
while(i<j)
{
while(i<j&&*(Array+j)>=median)
j--;//从右向左扫描,直到找到第一个小于median的Array[j]
*(Array+i)=*(Array+j);
while(i<j&&*(Array+i)<=median)
i++;//从左向右扫描,直到找到第一个大于median的Array[i]
*(Array+j)=*(Array+i);
}
*(Array+i)=median;//最后定位基准位置
return i;
}
//快速排序递归算法
//*Array:待排序数组
//l,h:数组左右边界
int Quicksort(int *Array,int l,int h)
{
int mid;
if(l<h)
{
mid=Partition(Array,l,h);
Quicksort(Array,l,mid-1);
Quicksort(Array,mid+1,h);
}
}