博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高速排序
阅读量:6040 次
发布时间:2019-06-20

本文共 2338 字,大约阅读时间需要 7 分钟。

原理:
基本思想:
1.从待排序列中任选一个元素作为轴点;
2.将序列中比轴点的值小的放到轴点左边,比轴点的值大的放到轴点右边;
3.以轴为分界线,分别对轴左边和右边部分递归进行1、2操作。
平均时间复杂度
     虽然高速排序的最坏时间为O(n
2),但就平均性能而言,它是基于keyword比較的内部排序算法中速度最快者,高速排序亦因此而得名。它的平均时间复杂度为O(nlgn)。
空间复杂度
     高速排序在系统内部须要一个栈来实现递归。若每次划分较为均匀,则其递归树的高度为O(lgn),故递归后需栈空间为O(lgn)。最坏情况下,递归树的高度为O(n),所需的栈空间为O(n)。
详细步骤:
考虑序列{49,38,65,97,76,13,27}
先总体运行一次高速排序:

原始序列:

取第一个元素的值作为轴点:

low指针与high指针初始时,分别指向arr[low]和arr[high],首先将轴点与high指针所指元素进行比較,若比轴点大,那么指针前移,否则将这个比轴点小的元素值拷贝到low指针指向的位置:

接着,将轴点与low指针所值元素进行比較,若比轴点小,那么low指针后移,否则将这个比轴点大的元素的值拷贝到
high所指向的位置。27比轴点49小,不用管,low指针后移,38比轴点49小,不用管,low指针继续后移。此时,low指针指向65,比轴点大,那么应该拷贝到high指针所指位置:

此时发现low指针与high指针没有相交,那么继续上面的操作:
65比49大,high指针前移,13比49小,那么进行一次复制:

接下来,把97拷贝到13的位置:

此时,high指针发现97>49,前移,76>49,前移,发现low和high重合,那么循环结束,此时将轴点的值放到这个位置。

如今能够看到,经过上面的若干步骤后,轴点左边元素均比轴点小,右边均比轴点大。紧接着,对左边和右边部分运行上面的步骤(递归),终于将形成有序序列。
实现:

int partition(int arr[],int low,int high){	int val = arr[low];//以arr[low]作为轴点,val记录轴点的值	while(low < high)	{		while(low
= val) { high--; } arr[low] = arr[high];//将轴点右側比轴点小的放到轴左边,使轴点右側均比轴点大 while(low < high && arr[low] <= val) { low++; } arr[high] = arr[low];//将轴点左側比轴点大的放到轴右边,使轴点左側均比轴点小 } arr[low] = val; return low;//返回轴点的位置}void quick_sort(int arr[],int low,int high){ int index;//记录轴点的位置 if(low < high) { index = partition(arr,low,high);//先对数组总体做一次快排,使轴左側均比轴小,轴右側均比轴大 quick_sort(arr,low,index-1);//接着,递归对轴左边部分进行快排 quick_sort(arr,index+1,high);//递归对轴右边进行快排 }}
完整代码:

/*高速排序by Rowandjj2014/7/22*/#include
using namespace std;int partition(int arr[],int low,int high){ int val = arr[low];//以arr[low]作为轴点,val记录轴点的值 while(low < high) { while(low
= val) { high--; } arr[low] = arr[high];//将轴点右側比轴点小的放到轴左边,使轴点右側均比轴点大 while(low < high && arr[low] <= val) { low++; } arr[high] = arr[low];//将轴点左側比轴点大的放到轴右边,使轴点左側均比轴点小 } arr[low] = val; return low;//返回轴点的位置}void quick_sort(int arr[],int low,int high){ int index;//记录轴点的位置 if(low < high) { index = partition(arr,low,high);//先对数组总体做一次快排,使轴左側均比轴小,轴右側均比轴大 quick_sort(arr,low,index-1);//接着,递归对轴左边部分进行快排 quick_sort(arr,index+1,high);//递归对轴右边进行快排 }}int main(){ //int arr[] = {4,2,1,6,9,11,3,5,8,10}; //int arr[] = {1,3,5,7,9,11,13,15,17,19}; int arr[] = {19,17,15,13,11,9,7,5,3,1}; int len = 10,i; quick_sort(arr,0,len); for(i = 0; i < len-1; i++) { cout<
<<" "; } cout<
測试:

你可能感兴趣的文章
pxe实现系统的自动化安装
查看>>
Redis高可用技术解决方案总结
查看>>
Scale Out Owncloud 高可用(2)
查看>>
何为敏捷
查看>>
HA集群之四:Corosync+Pacemaker+DRBD实现HA Mysql
查看>>
服务器定义
查看>>
我的友情链接
查看>>
Javascript覆盖率(jstd)数据解析Maven插件
查看>>
MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能
查看>>
c# 入门 例子
查看>>
HP Designjet 800PS 日常维护
查看>>
rhel7使用fdisk分区时无法使用全部分区的解决办法
查看>>
Docker 清理命令
查看>>
利用NRPE外部构件监控远程主机
查看>>
使用模块化编译缩小 apk 体积
查看>>
小别5年,又回到熟悉的行业。
查看>>
router-link传参
查看>>
ios之UISlider
查看>>
短信验证流程
查看>>
php 使用htmlspecialchars() 和strip_tags函数过滤HTML标签的区别
查看>>