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