2016.8.23--快速排序
来源:互联网 发布:四川麻将规则算法 编辑:程序博客网 时间:2024/05/16 15:48
快速排序
快速排序是冒泡排序的一种改进算法
快速排序将元素序列中的关键字与指定的元素进行比较,将逆序的两个元素交换
代码块
代码实现(基础版)
int partition(int *ar, int low, int high){ int i = low; int j = high; int tmp = ar[low]; while (i < j) { while (i < j && ar[j] >= tmp) --j; if (i < j) ar[i] = ar[j]; while (i < j && ar[i] <= tmp) ++i; if (i < j) ar[j] = ar[i]; } ar[i] = tmp; return i;}void Quicksort(int *ar, int low, int high){ if (low < high) { int mid = partition(ar,low,high); Quicksort(ar, low, mid - 1); Quicksort(ar, mid + 1, high); }}void QuickSort(int *ar, int len){ Quicksort(ar,0,len-1);}
测试
int main(){ int ar[11] = { 51,98,12,87,23,76,34,65,45,18,100 }; int len = sizeof(ar)/sizeof(ar[0]); show(ar, len); QuickSort(ar,len); show(ar, len); return 0;}
结果
代码实现(改进版)
//random随机数据作为参考数据,而不是固定的ar[low]//函数partition不变//rand()函数每次默认seed为1,所以每次随机都会是同一个位置//使用srand(time(NULL)),用当前时间去随机seed,可以达到让rand()函数seed变化//从而提高一点随机性void swap(int *a, int *b){ int *tmp = a; a = b; b = tmp;}void RandomNum(int *ar, int low, int high){ srand(time(NULL)); int num = rand() % (high-low) ; swap(ar[low], ar[low + num]);}void Quicksort(int *ar, int low, int high){ if (low < high) { RandomNum(ar, low, high); int mid = partion(ar,low,high); Quicksort(ar, low, mid - 1); Quicksort(ar, mid + 1, high); }}
其它改进方法
1)取数组0,n/2,n-1位置的3个元素,比较下标对应的元素值大小,取中间大小的作为函数partition()的参考值
2)取数组中位数作为参考值,取无序数组中位数的方法在《算法导论》上有
3)(待研究)当数据足够大时,当 high-low>100时(不一定是100,这个数个人认为在100个数左右,所有的排序算法时间差别不是很大,完全在可以接受的范围内),可以和其它的排序算法结合使用,具体情况具体分析(没有最好的,只有最合适的)
2016/8/23
1 0
- 2016.8.23--快速排序
- 23 快速排序2
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 浙大PAT甲级 1052
- Service混合模式
- APK瘦身记,如何实现高达53%的压缩效果
- 02网格布局Gridlayout
- 【操作系统】CentOS 7 ip地址与主机名绑定
- 2016.8.23--快速排序
- (02)Makefile综述
- 单例模式/工厂模式
- SDUT OJ 3400数据结构实验之排序三:bucket sort
- struts2初学笔记(二)validate验证
- python解析含有重复key的json
- 交叉编译参数--build、host和target的区别
- d3.js 画圆形菜单
- listview介绍及使用