快速排序
2017-04-06 10:57
169 查看
快速排序
描述
快速排序的基本采用分治的思想通过每一趟的排序将数据分割成两部分,左边的一部分全部不大于主元素,右边的一部分不小于主元素,然后再递归的对着两部分元素进行分割,最终变成有序序列。 快速排序的基本步骤:
1、从数据序列中取出一个主元素也就是作为参考点;
2、将左边大于主元素的数据交换到主元素的右边;
3、通过递归不断的遍历主元素的左右两边的元素,最终实现元素的有序。
示意图:
C语言源码:
/** * 快速序算法(L为要进行排序的线性顺序表) */ typedef int type; void print_array(type *L, int len, char *msg); /** * 用于交换元素 */ void swap(type *a, type *b) { type tmp = *a; *a = *b; *b = tmp; } /** * L 为type类型的可进行大小对比的线性顺序表 * len 为线性顺序表的长度 */ /** * 划分数据序列为主元素的左边全部不小于主元素,主元素的左边全部不大于主元素(核心) */ int partition(type *L, int low, int high) { type tmp = L[high]; int i = low - 1; //跟踪当前大于主元素的下标 int j = 0; //遍历当前区间的下标 for (j = low; j < high; j++) { if (L[j] <= tmp) { i++; swap(&L[i], &L[j]); } } swap(&L[i + 1], &L[high]); //print_array(L, ARRAY_SIZE, "排序中:"); return i + 1; } /** * 递归的对序列进行调整 */ void quick_sort(type *L, int low, int high) { if (low < high) { int mid = partition(L, low, high); quick_sort(L, low, mid - 1); quick_sort(L, mid + 1, high); } }
快速排序的效率:
最坏情况为O(n2)最好情况为O(nlogn)
改进:
因为快速排序算法的特性,序列的随机性越好相对来说算法的效率就越高,而实际遇到的数据不太可能遵循我们的预期,因此可以人为的打乱数据,将数据进行随机化处理,再次调用快速排序进行排序效率。int random_partition(type* L, int low,int high) { srand(time(NULL)); int i = rand()%high + low; swap(&L[low],&L[i]); return partition(L,low,high); } void random_quicksort(type *L, int low, int high) { if(low < high) { int mid = random_partition(L,low,high); random_quicksort(L,low, mid - 1); random_quitsort(L,mid + 1,high); } }
相关文章推荐
- 貌似桶排序的快速排序—线性时间
- 算法—快速排序(java)
- 关于快速排序
- 快速排序+随机快速排序
- 舍伍德算法改进快速排序
- 排序之快速排序(找女朋友)
- 冒泡排序、快速排序
- 排序算法之快速排序
- 快速排序
- 第七届蓝桥杯 快速排序
- 二 快速排序(冒泡排序和快速排序)
- 快速排序算法原理及实现(单轴快速排序、三向切分快速排序、双轴快速排序)
- 小小c#算法题 - 6 - 快速排序 (QuickSort)
- 算法入门--快速排序
- java实现快速排序
- python实现快速排序的示例(二分法思想)
- 数据结构和算法系列5 七大排序之冒泡排序和快速排序
- 排序——快速排序
- 数据结构常用算法复习---快速排序
- 使用c++头文件algorthm的sort函数进行快速排序