快速排序基于不同枢纽的实现方法
来源:互联网 发布:淘宝培训教材 编辑:程序博客网 时间:2024/06/11 18:35
快速排序法事应用最广泛的排序算法之一,最佳情况下时间复杂度是 O(nlogn)。但是最坏情况下可能达到O(n^2)。说明快速排序达到最坏情况的原因。并提出改善方案并实现之。
改进方案:通过改变枢轴值得选取:
1 选择数组头数字
int part(int a[],int first,int last){int pivote=a[first];int low=first+1;int high=last;while(high>low){//从左向右搜索比枢轴大的while(low<=high&&a[low]<=pivote)low++;//从右向左搜索比枢轴小的while(low<=high&&a[high]>pivote) high--;//直到第一个大于枢轴的左边和第一个小于枢轴的右边出现,交换if(high>low){int t=a[low];a[low]=a[high];a[high]=t;}}//返回此次枢轴的坐标while(high>first&&pivote<=a[high])high--;if(pivote>a[high]){a[first]=a[high];a[high]=pivote;return high;}else return first;}
2 选择数组尾数字
//枢轴选择尾数字int part1(int a[],int first,int last){ int pivote=a[last]; int low=first; int high=last-1; while(high>low){ //从左向右搜索比枢轴大的 while(low<=high&&a[low]<=pivote)low++; //从右向左搜索比枢轴小的 while(low<=high&&a[high]>pivote) high--; //直到第一个大于枢轴的左边和第一个小于枢轴的右边出现,交换 if(high>low){int t=a[low];a[low]=a[high];a[high]=t;} } //返回此次枢轴的坐标 while(low<last&&pivote>=a[low])low++;; if(pivote<a[low]){a[last]=a[low];a[low]=pivote; return low;} else return last;}
3 选择数组中间数字
int part2(int a[],int first,int last){ //选取枢轴位置,取首元素,中间元素和末尾元素的中值作为枢轴int low=first;int high=last; int mid=low + ((high - low) >> 1);//计算数组中间的元素下标//将枢轴元素放在第一个位置 if(mid!=first){int t=a[mid];a[mid]=a[first];a[first]=t;}return part(a,first,last);}4 选择随机数作为枢轴
//选择随机数int part4(int a[],int first,int last){int low=first;int high=last;srand(time(0));int index=rand()%(high-low)+low;//产生low-high之间随机数if(index!=first){int t=a[index];a[index]=a[first];a[first]=t;}return part(a,first,last);}
5 选择头数字尾数字和中间值的中位值
//选择头数字尾数字和中间值的中位值int part3(int a[],int first,int last){int low=first;int high=last; int mid=low + ((high - low) >> 1);int index =mid1(first,last,mid);//求中位值 if(index!=first){int t=a[index];a[index]=a[first];a[first]=t;}return part(a,first,last);}最后:
//快速排序void quicksort(int a[],int first,int last){if(last>first){int pri=part4(a,first,last);quicksort(a,first,pri-1);quicksort(a,pri+1,last);}}void quicksort(int a[],int size){quicksort(a,0,size-1);}
0 0
- 快速排序基于不同枢纽的实现方法
- 快速排序的枢纽元选取策略
- 快速排序的不同语言不同方法实现的…
- 快速排序的不同语言不同方法实现的…
- 快速排序的不同语言不同方法实现的…
- 高级排序-快速排序,最右边的值为枢纽
- 快速排序枢纽值(基元)选择方法(转载)
- 基于java的快速排序实现
- 快速排序代码(选择最右值最为枢纽元)
- 快速排序普通法与中值枢纽元法以及三切法
- 快速排序-几种不同的划分方法
- 快速排序的三种不同的实现方式。
- C#--基于delegate实现不同功能的排序
- 快速排序+基于c#实现
- 不同版本的快速排序
- 快速排序的几种实现方法
- 快速排序的三种实现方法
- 快速排序的两种实现方法
- TGA文件格式整理
- Java编程中“性能优化”相关Tips
- PADS学习之路07-PADS LOGIC下拉菜单Tools
- LeetCode-69 Sqrt(x)
- 《C Primer Plus(第五版)中文版》第8章第1至8题
- 快速排序基于不同枢纽的实现方法
- XCode调试技巧之EXC_BAD_ACCESS中BUG解决
- 选择排序
- 第四章作业3
- java之 ------ 类的封装、继承和多态(一)
- '惊''喜'交加的自考大挑战
- hadoop学习笔记(1)
- 冒泡排序
- RailsCasts中文版,#25 SQL Injection 谨防SQL注入