快速排序(小白入门专用,大神请无视)

刷PAT德才论的时候发现自己排序算法基本不懂,只会最简单的冒泡,于是百度了一下算法,按照稳定性和时间复杂度,暂时先学习了快速排序(因为大部分时候数据都是无序的,有序时快速排序很浪费时间)。按照考试要求,知识点要先了解,再掌握,最后精通。呃,精通不是一天两天的事,先掌握了再说吧。。

一、了解

一开始编程差不多就接触排序了,但是这部分在数据结构课上我越学越晕,一直处于一知半解的状态,而且考试时这部分也不要求编程,呃,然后你就懂了。。我大概了解是如何排序的,但是不会写代码。嗯,不会写代码知识果然很容易忘,几个排序方法基本忘光了,只剩下入门级的冒泡排序,问题是这货效率太低,完全拿不出手。排序是在算法里面算是比较基础的部分。

我找到一篇文章,里面的讲解基本上和课本差不多,介绍得很详细:http://blog.csdn.net/hguisu/article/details/7776068

由于我理解能力不行,看完以后并没有完全明白,于是我又找到了另一篇文章,跟我一样的孩子请继续往下看。


二、掌握

这是我找到的另一篇文章,看完以后我才算真正明白了快速排序:http://www.cnblogs.com/foreverking/articles/2234225.html

我把代码注释了一下(我不仅理解能力有问题,表达能力貌似也有问题,感觉只有自己能看懂注释。。):

public class Quick {
	private int partition(int a[], int left, int right) {
		int i = left;
		int j = right;
		int temp = a[i];
		while (i < j) {//若指针未相遇,则做一次排序,否则表示排序完成,退出排序
			//指针从右往左跑
			while (i < j && a[j] >= temp){//若右边的数大于对比数temp则一直往左对比,直到找到一个数小于对比数,则跳出循环
				j--;//未找到,指针继续左移
			}
			if (i < j){//若指针未相遇,则将上个循环找到的数赋值给对比数,用找到的数占用对比数的位置
				a[i] = a[j];//此时序列中已没有对比数temp,但是它的值并未消失,用temp保存
			}
			//指针从左往右跑
			while (i < j && a[i] <= temp){//若指针仍未相遇,则对比左边的数
				i++;//若左边的数小于对比数,则指针右移,若左边的数大于对比数,则结束循环
			}
			if (i < j){//若指针未相遇
				a[j] = a[i];//同上,把大数赋值给上一个结束点
			}
		}
		//若指针相遇,即i=j时,结束上述循环
		a[i] = temp;//把temp赋值给相遇点,此时能保证左边的数全部小于temp,右边的数全部大于temp
		return i;
	}

	private void quickSort(int[] sort, int left, int right) {
		int dp;
		if (left < right) {
			//第一次循环,通常不能保证排序正确,但是能保证左边的数全部小于temp,右边的数全部大于temp
			dp = partition(sort, left, right);
			System.out.println("partition(sort,"+left+", "+right+")结果为:");
			for (int i = 0; i < 5; i++) {
				System.out.print("sort[" + i + "]=" + sort[i]+" ");
			}
			System.out.println();
			//由于第一次循环结束已经将序列分成了两部分,现在排序左边的部分
			quickSort(sort, left, dp - 1);
			System.out.println("quickSort(sort,"+ left+", "+(dp - 1)+")结果为(此时dp="+dp+"):");
			for (int i = 0; i < 5; i++) {
				System.out.print("sort[" + i + "]=" + sort[i]+" ");
			}
			System.out.println();
			//排序右边的部分
			quickSort(sort, dp + 1, right);
			System.out.println("quickSort(sort, "+(dp + 1)+", "+right+")结果为(此时dp="+dp+"):");
			for (int i = 0; i < 5; i++) {
				System.out.print("sort[" + i + "]=" + sort[i]+" ");
			}
			System.out.println();
		}
	}

	public static void main(String[] args) {
		int sort[] = { 20,40,50,10,60};
		System.out.println("原始数据:");
		for (int i = 0; i < 5; i++) {
			System.out.print("sort[" + i + "]=" + sort[i]+" ");
		}
		Quick q=new Quick();
		q.quickSort(sort, 0, 4);
	}
}

三、依据

看完上面基本上就掌握了快速排序,下面是我选择快速排序时参考的博文,算是分析贴。我不会说很多东西我都没看懂,我只看了时间复杂度,并且在计算时发现自己把对数也给忘了。。现在我都不好意思说自己是理科生。

http://blog.chinaunix.net/uid-26565142-id-3126683.html

http://blog.csdn.net/sszgg2006/article/details/7573390

PS:课本具体名字记不清了,大概是《数据结构》,出版社倒是印象深刻——清华大学出版社

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值