算法核心:
快速排序是基于分治策略的一种性能比较好的一种排序算法。
基本思想:
通过一趟排序将待排记录分割成独立的两个部分,其中一部分的关键字均比另一部分的关键字小,然后对这两个部分记录分别继续排序,已达到整个序列有序的目的。
步骤:
(1)分解(Divide):以a[p]为基准元素将a[p:r]划分成3段a[p:q-1] a[q]和a[q+1:r],使a[p:q-1]中的任何一个元素小于等于a[q],a[q+1:r]中任何一个元素大于等于a[q]。下标q在划分过程中确定。
(2)递归求解(Conquer):通过递归调用快速排序算法分别对a[p:q-1]和a[q+1:r]进行排序。
(3)合并(Merge):由于对a[p:q-1]和a[q+1:r]的排序是就地进行的,所以在a[p:q-1]和a[q+1:r]都已经排好顺序了,不需要级执行任何的计算,a[p:r]就已经排序完成。
算法实现:
方法一:这个方法是借鉴书上的,很合理,值得记住。
#include <stdio.h>
#include <stdlib.h>
//方法一
int Partition(int L[],int low,int high);
void QSort(int L[],int low,int high);
//方法二 做标记法
void QuickSort(int L[],int low,int high,int flag,int value,int serial);
void Input(int L[],int x);
void Print(int L[],int x);
int main()
{
int x;
int L[40]={0};
printf("请输入序列个数\n");
scanf("%d",&x);
Input(L,x);
QSort(L,0,x-1);//注意端点
Print(L,x);
return 0;
}
int Partition(int L[],int low,int high){
int Privotkey=L[low];
while(low<high){
while(low<high && L[high]>Privotkey)//将不想要的情况都循环结束。
high--;
L[low]=L[high];
while(low<high && L[low]<Privotkey)
low++;
L[high]=L[low];
}
L[low]=Privotkey;
return low;
}
void QSort(int L[],int low,int high){
int privotloc;
if(low < high)
{
privotloc=Partition(L,low,high);//递归中非递归的部分可以单独成函数
QSort(L,low,privotloc-1);
QSort(L,privotloc+1,high);
}
}
void Input(int L[],int x){
int i;
for(i=0;i<x;i++)
scanf("%d",&L[i]);
}
void Print(int L[],int x){
int i;
for(i=0;i<x;i++)
printf("%d ",L[i]);
}
运行结果如下:
代码可以直接运行,做过测试,感觉速度还是可以的。
下面的这种方法是我自己草拟写出来的,结果后来验证发现除了问题,我就没有继续做任何下去的补充了。因为相对于上面的这种,这个方法已经没有意义了。
方法思路:将对于一次快速排序的过程同总的过程一起用递归实现,用一个函数来代替上面的。结果发现在两个不同的递归过程中,参数的改变成为了一个大问题。现在将代码写出来,做个记录,方便思维拓展。
这个方法有问题,注意low的值已经换了,不能再用了,所以这种方法又麻烦,有不合适
void QuickSort(int L[],int low,int high,int flag,int value){//这个方法有问题,注意low的值已经换了,不能再用了,所以这种方法又麻烦,有不合适
if(low>=high){
L[low]=value;
QuickSort(L,low,serial-1,1,L[low]);
QuickSort(L,serial+1,high,1,L[serial+1]);
}
if(flag==1){
while(low<high && value<L[high])
high--;
L[low]=L[high];
QuickSort(L,low++,high,2,value);
}
else{
while(low<high && value>L[low])
low++;
L[high]=L[low];
QuickSort(L,low,high--,1,value);
}
}
大家有什么问题请留言。