zoukankan      html  css  js  c++  java
  • 快速排序算法

    快速排序算法

    原理

    1. 先从数组中取出一个数作为基准i
    2. 以i为参照,比i大的数据放在左边,比i小的数据放在右边
    3. 依次类推,把第2步划分出来的两个区域,内部再以此方法递归,最终获取排序
    4. 时间复杂度实际为n + nlogn ,由于n >= 2时,nlogn > =n ,因此取为 O(n*logn) logn取值公示: n = 2^m ====>> m = logn

    实现

    package com.liuj.art;
    
    /**
     */
    public class Quick {
    
    
    	public static void main(String[] args) {
    		int[] arr = new int[]{3, 4, 1, 21, 10, 6, 0};
    		int[] arr2 = new int[]{21, 10, 6, 4, 3, 1, 0};
    		int[] arr3 = new int[]{0, 1, 3, 4, 6, 10, 21};
    		sort(arr, 0, arr.length - 1);
    		printlnArr(arr);
    	}
    
    	/**
    	 * 从小到大排序
    	 *
    	 * @param arr
    	 */
    	public static void sort(int[] arr, int left, int right) {
    		if (left < right) {
    			int findx = arr[left];
    			int i = left;
    			int j = right;
    			while (i < j) {
    				System.out.println("new");
    
    				//从右向左找到第一个比findx小的元素
    				while (i < j && findx <= arr[j]) {
    					j--;
    
    				}
    
    				//如果没有找到比findx小的元素,则j--会一直减少,最终变为与i相同
    				//将j的值覆盖i的值
    				if (i < j) {
    					arr[i] = arr[j];
    					printlnArr(arr);
    					i++;
    				}
    
    				while (i < j && findx > arr[i]) {
    					//从左向右找第一个比findx大的节点
    					//移动到右边
    					i++;
    				}
    
    				//如果没有找到比findx大的元素,i++会一直增加,直到与j相同
    				if (i < j) {
    					arr[j] = arr[i];
    //                    swap(arr, i, j);
    					printlnArr(arr);
    					j--;
    				}
    			}
    
    			System.out.println("out while i:" + i + " findx:" + findx);
    			arr[i] = findx;
    			printlnArr(arr);
    			System.out.println("a lun hui ,left:" + left + " i:" + i + " right:" + right);
    
    			sort(arr, left, i - 1);
    			sort(arr, i + 1, right);
    		}
    	}
    
    	private static void swap(int[] arr, int i, int j) {
    		int t = arr[j];
    		arr[j] = arr[i];
    		arr[i] = t;
    		printlnArr(arr);
    	}
    
    	public static void printlnArr(int[] arr) {
    		String str = "";
    		for (int i : arr) {
    			str += i + " ";
    		}
    		System.out.println(str);
    	}
    }
    

    代码结果

    new
    0 4 1 21 10 6 0 
    0 4 1 21 10 6 4 
    new
    0 1 1 21 10 6 4 
    out while i:2 findx:3
    0 1 3 21 10 6 4 
    a lun hui ,left:0 i:2 right:6
    new
    out while i:0 findx:0
    0 1 3 21 10 6 4 
    a lun hui ,left:0 i:0 right:1
    new
    0 1 3 4 10 6 4 
    out while i:6 findx:21
    0 1 3 4 10 6 21 
    a lun hui ,left:3 i:6 right:6
    new
    out while i:3 findx:4
    0 1 3 4 10 6 21 
    a lun hui ,left:3 i:3 right:5
    new
    0 1 3 4 6 6 21 
    out while i:5 findx:10
    0 1 3 4 6 10 21 
    a lun hui ,left:4 i:5 right:5
    0 1 3 4 6 10 21
  • 相关阅读:
    汉明距离
    Go_go build 和 go install
    rabbitmq的简单介绍二
    rabbitmq的简单介绍一
    redis的订阅和发布
    python操作redis
    vmware虚拟机开机报附件中的错误的解决办法
    使用twised实现一个EchoServer
    python事件驱动的小例子
    mysql数据库的最基本的命令
  • 原文地址:https://www.cnblogs.com/windliu/p/9203987.html
Copyright © 2011-2022 走看看