zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    策略梯度(Policy Gradient)
    无约束优化问题
    有约束优化问题
    计算机网络学习资料
    为什么要用等效基带信号?
    通信网实验—话务量分析
    无感数据埋点(自定义注解+aop+异步)
    排序算法
    位运算常见操作
    数据库与缓存一致性的几种实现方式
  • 原文地址:https://www.cnblogs.com/hark0623/p/4343464.html
Copyright © 2011-2022 走看看