快速排序 暑假补习之排序算法
来源:互联网 发布:2017网络教育统考时间 编辑:程序博客网 时间:2024/06/12 01:23
按照排序算法的实用分析,快速排序也许是性能最高的一种排序算法了。
1. 简单complexity分析
时间复杂度O(nlogn)
最坏情况O(n^2) :如果pivot的选择不恰当的话。 当然看过博客写过实际环境中,选pivot可选第一个元素,也可随机选择,也可以规律选择,比如在头尾以及中间元素间选择,我个人的观点是按实际情况分析,因为我理解的程序不是照搬,数据结构和算法都千变万化,只选择最适合当前的情况的最符合自己思维习惯的即可,当然要符合bug free的规律。
空间复杂度O(nlogn)
2. 不稳定排序
按照WIKI的解释,不稳定排序是在两个或多个相等元素在排序之后,可使相对位置发生改变的一种排序。不稳定排序算法的种类比较多,知道稳定排序的基本排序算法即可。如下:
冒泡排序(BubbleSort) 插入排序(Insertion Sort) 归并排序(MergeSort)基数排序(Radix Sort)
3. 快速排序主要思想
当我前期学习快速排序时,非常迷惑,后来知道一个原理就是小的放在pivot左边,大的放在pivot右边。当然这只是快速排序的一个步骤,就是选择分割点。那么分治算法的“分”的第一步就在这里实现。那么选择pivot是个仁者见仁的事情了,可根据需求进行分析,哪里选择pivot是可以对程序运行质的提高的。pivot的移动主要就是通过交换,一步步的交换会把pivot放在最终位置,那个位置就是分割点,左边的是小的,右边的值比分割点大。
4. 基本代码:
基本流程:
public static int[] quickSort(int[] test, int low, int high){if(low < high){int pivot = getPivot(test,low,high);//得到pivotquickSort(test,low, pivot-1);//递归排序pivot左边数据 quickSort(test,pivot+1,high);//递归排序pivot右边数据}return test;
获取Pivot的代码:
//version 1: 此代码思想是借鉴网友的,并非我自己写的,特此标注。
public static int getPivot(int[] array, int start, int end ){int key = array[start];while(start < end){while(start < end && array[end] >= key) end --;array[start] = array[end];while(start < end && array[start] <= key )start++;array[end] = array[start];}array[start] = key;return start;}}
//version2:
// 这段代码是按照自己的理解写的,看起来sloppy。 留下来给自己 做耻笑状 之用。
public static int partition(int[] test, int low, int high){int key = test[low];int tmp =0;while(low<high){while(test[high] >= key && low<high) high--;if(test[high] < key) {tmp = test[high];test[high] = test[low];test[low]= tmp;low ++;}while(test[low]<=key && low <high) low++; if(test[low] > key){tmp = test[high];test[high] = test[low];test[low]= tmp;high--;}}return low;}
5. 综合排序算法分析,请参考:
这篇文章写的比较详尽:
http://www.cnblogs.com/ziyiFly/archive/2008/09/10/1288516.html
(本文是本人暑假补习记录,写的不好,欢迎大家吐槽,写的不对,欢迎大家指正)
- 快速排序 暑假补习之排序算法
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法 之 快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- JAVA笔记十三(50-51 综合练习)
- Color Conversion Algorithms
- Matlab函数cat:矩阵联结函数
- 电脑自动开机并播放音乐
- windows快捷键
- 快速排序 暑假补习之排序算法
- 基本黑客命令
- phonegap2.8.1新建andorid工程
- 第一php程序
- CareerCup 3.2
- 如何恢复/修复MSSQL数据库的MDF文件
- OCJP之Console
- 35+个实用jQuery菜单插件
- Cocos2d-x 内存管理浅说