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

    快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。

    步骤为:

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

    递回的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递回下去,但是这个演算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

    import java.util.Arrays;
    public class Main{	
    	public static void swap(int[] arr,int i,int j){
    		int tmp=arr[j];
    		arr[j]=arr[i];
    		arr[i]=tmp;
    	}
    	public static int partition(int[] arr,int left,int right){
    		int privotValue=arr[right];
    		int i=left-1;
    		for(int j=left;j<=right-1;j++){
    			if(arr[j]<=privotValue){
    				i++;
    				swap(arr,i,j);
    			}
    		}
    		swap(arr,i+1,right);
    		return i+1;
    	}
    	public static int partitionDoubleDirection(int[] arr,int left,int right){
    		int i=left;
    		int j=right+1;
    		int v=arr[left];
    		while(true){
    			while(i<=right&&arr[++i]<v){
    				;
    			}
    			while(j>=left&&arr[--j]>v){
    				;
    			}
    			if(i>=j) break;
    			swap(arr,i,j);		
    		}
    		swap(arr,left,j);
    		return j;
    	}
    	public static void quicksort(int[] arr,int left,int right){
    		if(left<right){
    			//int par=partition(arr,left,right);
    			int par=partitionDoubleDirection(arr,left,right);
    			quicksort(arr,left,par-1);
    			quicksort(arr,par+1,right);
    		}
    	}
    	//三向切分
    	public static void sort(int[] arr,int left,int right){
    		if(left>=right){
    			return;
    		}
    		int lt=left;
    		int gt=right;
    		int v=arr[left];
    		int i=left;
    		while(i<=gt){
    			if(arr[i]<v){
    				swap(arr,lt++,i++);
    			}else if(arr[i]>v){
    				swap(arr,i,gt--);
    			}else{
    				i++;
    			}
    		}
    		sort(arr,left,lt-1);
    		sort(arr,gt+1,right);
    	}
    	public static void isSort(int[] arr){
    		for(int i=0,j=1;j<arr.length;i++,j++){
    			if(arr[i]>arr[j]){
    				System.out.println("排序失败");
    				System.out.print(Arrays.toString(arr));
    				return;
    			}
    		}
    		System.out.println("排序成功");
    		System.out.print(Arrays.toString(arr));
    	}
    	public static void main(String[] args){
    		int[] arr=new int[10000];
    		for(int i=0;i<10;i++){
    			arr[i]=(int)(Math.random()*1000);
    		}
    		//quicksort(arr,0,arr.length-1);
    		sort(arr,0,arr.length-1);
    		isSort(arr);
    	}
    }
    

      

      

     
  • 相关阅读:
    mac c++编译出现segmentation fault :11错误
    ssh 连接缓慢解决方法
    237. Delete Node in a Linked List
    203. Remove Linked List Elements
    Inversion of Control Containers and the Dependency Injection pattern
    82. Remove Duplicates from Sorted List II
    83. Remove Duplicates from Sorted List
    SxsTrace
    使用CCleaner卸载chrome
    decimal and double ToString problem
  • 原文地址:https://www.cnblogs.com/wqkant/p/5294238.html
Copyright © 2011-2022 走看看