码迷,mamicode.com
首页 > 编程语言 > 详细

Hark的数据结构与算法练习之快速排序

时间:2015-03-17 08:07:29      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

---恢复内容开始---

前言

快速排序是最常见,也是面试中最容易考的排序方法,这里做一下总结

 

算法说明

其实这里说的很清楚了:http://blog.csdn.net/morewindows/article/details/6684558 

不过我还是打算按自己的逻辑再描述一下,如果看不懂,再去看这位大神的贴子啦。

快速排序其实用的也是分而治之的思路,流程是:

1、假如做的是降序排序;先拿数组的第一个数字作为基数,从右至左找出比基数大于等于的数字,放到基数的左侧。再从左至右找到比基数小的数字,放到基数的右侧。

2、然后以基数为中心点,再将基数左侧进行一下1中的排序。  再将基数右侧进行一下1中的排序。 如何递归,最终得出排序结果

3、有一点要说明的,按那位大神的解释,按基数进行数字交换时,使用的是挖坑法进行交换的,例如:

1)、我们有数组int[] arrayData = { 5, 9, 6, 7, 4, 1, 2, 3, 8 };

2)、第一轮中,我们以5为基数进行左右排序, 这时5的索引0就是第一个坑。我们需要找到数字往坑填数。

3)、先从右向左查找。   OK,我们找到3,也就是索引7。 我们先把3写到arrayData[0]中(2中挖好的坑哟)。 然后arrayData[7]就是待填的坑了

4)、再从左向右查找,这时的开始查找索引是arrayData[1]。 往右找比5小的,我们发现是4, 然后将4放到arrayData[7]中(3挖好的坑)。 然后arrayData[4]就是待填的坑了(arrayData[4]就是数字4的索引)

5)、接着从右向左查找。 开始索引是6。。。然后就是填坑,挖坑,左向右查找。。。以此类推

6)、最终i==j时,就跳出循环啦

 

代码

使用的是java

/*
 * 快速排序
 */
public class QuickSort {
	public static void main(String[] args) {
		int[] arrayData = { 5, 9, 6, 7, 4, 1, 2, 3, 8 };
		QuickSortMethod(arrayData);
		for (int integer : arrayData) {
			System.out.print(integer);
			System.out.print(" ");
		}
	}

	public static void QuickSortMethod(int[] arrayData) {
		Sort(arrayData, 0, arrayData.length - 1);
	}

	public static void Sort(int[] arrayData, int beginIndex, int endIndex) {
		if (beginIndex < endIndex) {
			int i = Adjust(arrayData, beginIndex, endIndex);
			Sort(arrayData, beginIndex, i - 1);
			Sort(arrayData, i + 1, endIndex);
		}
	}

	// 返回最终排序后基数的位置
	public static int Adjust(int[] arrayData, int beginIndex, int endIndex) {
		int i = beginIndex;
		int j = endIndex;
		int temp = arrayData[i]; // 基数
		while (i < j) {
			// 先从右向左找,找比temp大的数字
			while (i < j && arrayData[j] <= temp) {
				j--;
			}
			if (i < j) {
				arrayData[i] = arrayData[j]; // 找到右侧比temp基数大的数字后,放到左侧索引中
				i++; // 左侧索引加1,开始向右侧寻找比temp基数小的数字
			}

			while (i < j && arrayData[i] > temp) { // 向右寻找比temp基数小的数字
				i++;
			}
			if (i < j) {
				arrayData[j] = arrayData[i];
				j--;
			}
		}
		arrayData[i] = temp;
		return i;
	}
}

最终结果

9 8 7 6 5 4 3 2 1 

算法复杂度:O(nlog2n)

空间复杂度:O(log2n)

  

 

参考

http://blog.csdn.net/morewindows/article/details/6684558

---恢复内容结束---

Hark的数据结构与算法练习之快速排序

标签:

原文地址:http://www.cnblogs.com/hark0623/p/4343464.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!