夕拾-数据结构-快速排序

来源:互联网 发布:打开数据连接无法上网 编辑:程序博客网 时间:2024/06/06 08:32

朝花夕拾,很长时间没有弄算法了,可不能荒废,先从数据结构的算法复习,之后在复习诸如图论,数论,贪心之类的算法。 


还望君持之以恒,良辰他日必有重谢!


快速排序,在实际应用中算是比较高效的排序算法


具体思想如下:

1.在序列中,选择一个元素作为中枢元素(中枢元素:左边的不比其大,右边的不比其小),一般选择第1个元素即可

2.从右到右扫描,找到一个比中枢元素小的元素,和中枢元素交互位置  (此时,中枢元素已经易位)

3.从左到右扫描,找到一个比中枢元素大的元素,和中枢元素交互位置

重复步骤1-3,简单交换的代码如下:


void Swap(int &a,int &b){int temp;temp=a;a=b;b=temp;}//简单交互 int PartitionSwap(int a[],int low,int heigh){int piv=a[low];//选择序列的第一个为中枢元素 while(low<heigh){while(low<heigh && piv<=a[heigh]) --heigh;Swap(a[heigh],a[low]);while(low<heigh && piv>=a[low])++low;Swap(a[heigh],a[low]);} a[low]=piv; //原始中枢归位 return low; //返回中枢下标 }


Fill-算法改进:

上面代码的缺点:每一次找到了合适的元素都要和中枢元素进行交换位置。

改进:中枢元素只记录其值,暂时不考虑它的位置。当前扫描得到合适元素,直接覆盖上一次扫描得到的位置(第一次为中枢元素的原始位置)。最后一次扫描,得到的位置即为中枢元素的最终位置         ( ps:该方法在堆排序中也运用到了)


//改进填充 int PartitionFill(int a[],int low,int heigh){int piv=a[low];//选择序列的第一个为中枢元素 while(low<heigh){while(low<heigh && piv<=a[heigh]) --heigh;a[low]=a[heigh]; while(low<heigh && piv>=a[low])++low;a[heigh]=a[low];} a[low]=piv; //原始中枢归位 return low; //返回中枢下标 }


快速排序递归过程:

int QuickSort(int a[],int low,int heigh){if(low<heigh){int pivpos=PartitionFill(a,low,heigh);//获得当序列的中枢位置 QuickSort(a,low,pivpos-1); //递归排序左边序列 QuickSort(a,pivpos+1,heigh); //递归排序右边序列 }}


后言:该算法的思想可以解决如,红白蓝旗分类和正数在负数后一类的问题



0 0
原创粉丝点击