zoukankan      html  css  js  c++  java
  • 快速排序算法图文详解(模版使用)

    算法介绍

    快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

    算法描述

    快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:

    步骤1:从数列中挑出一个元素,称为 “基准”(pivot );
    步骤2:重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
    步骤3:递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

    算法实现

        public void quickSort(int[] num, int left, int right) {
    		//如果left等于right,即数组只有一个元素,直接返回
    		if(left>=right) {
    			return;
    		}
    		//设置最左边的元素为基准值
    		int key=num[left];
    		//数组中比key小的放在左边,比key大的放在右边,key值下标为i
    		int i=left;
    		int j=right;
    		while(i<j){
    			//j向左移,直到遇到比key小的值
    			while(num[j]>=key && i<j){
    				j--;
    			}
    			//i向右移,直到遇到比key大的值
    			while(num[i]<=key && i<j){
    				i++;
    			}
    			//i和j指向的元素交换
    			if(i<j){
    				int temp=num[i];
    				num[i]=num[j];
    				num[j]=temp;
    			}
    		}
    		num[left]=num[i];
    		num[i]=key;
    		quickSort(num,left,i-1);
    		quickSort(num,i+1,right);
    	}
    

    算法分析

    时间复杂度度O(nlogn),空间复杂度(logn)。

    不稳定排序(例a与b值相同,但是在比较后有可能会发生位置变化)

    内排序(所有排序操作都在内存中完成)

  • 相关阅读:
    C/C++多文件之间的变量定义
    PKU POJ 2186 Popular Cows 强连通分量
    重载函数
    ZOJ 2763 Prison Break
    201357 训练赛总结
    hdu 4467 Graph 构造
    201356 训练赛总结
    201353 NEERC 2012, Eastern subregional contest
    2013512 CF 183 总结
    一道动态规划
  • 原文地址:https://www.cnblogs.com/CryFace/p/13430936.html
Copyright © 2011-2022 走看看