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

  • 相关阅读:
    stenciljs 学习四 组件装饰器
    stenciljs 学习三 组件生命周期
    stenciljs 学习二 pwa 简单应用开发
    stenciljs ionic 团队开发的方便web 组件框架
    stenciljs 学习一 web 组件开发
    使用npm init快速创建web 应用
    adnanh webhook 框架 hook rule
    adnanh webhook 框架 hook 定义
    adnanh webhook 框架request values 说明
    adnanh webhook 框架execute-command 以及参数传递处理
  • 原文地址:https://www.cnblogs.com/hark0623/p/4343464.html
Copyright © 2011-2022 走看看