快速排序 暑假补习之排序算法

按照排序算法的实用分析,快速排序也许是性能最高的一种排序算法了。

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);//得到pivot
			quickSort(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
(本文是本人暑假补习记录,写的不好,欢迎大家吐槽,写的不对,欢迎大家指正)




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值