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

前言

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

 

算法说明

其实这里说的很清楚了: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

 

你可能感兴趣的:(数据结构与算法)