• 快速排序及与随机快排间的性能比较


    快排时间复杂度:nlogn

    java代码1:对输入数组实现快排

    import java.util.Scanner;
    
    public class Temp {		
    	public static void main(String[] args){
    		Scanner s = new Scanner(System.in);
    		int[] arr = new int[10];
    		for(int i=0;i<arr.length;i++){
    			arr[i] = s.nextInt();
    		}
    		printArr(arr);
    		Temp t = new Temp();
    		t.quickSort(arr, 0, arr.length-1);
    		printArr(arr);
    	}
    	
    	public void quickSort(int[] a,int left,int right){
    		int i = left;
    		if(left<right){
    			for(int j = left;j<a.length;j++){
    				if(a[j]<a[right]){
    					swap(a,i,j);
    					i = i+1;
    				}
    			}
    			swap(a,i,right);
    			quickSort(a,left,i-1);
    			quickSort(a,i+1,right);
    		}		
    	}
    	
    	private void swap(int[] a,int i,int j){
    		int temp;
    		temp = a[i];
    		a[i] = a[j];
    		a[j] = temp;
    	}
    	
    	public static void printArr(int[] a){
    		for(int i=0;i<a.length;i++){
    			System.out.print(a[i]+" ");
    		}
    		System.out.println();
    	}
    	
    }
    

      输出结果:

    java代码2:对随机产生的10组包含一百万个数字(大小在0-1000之间)的数组进行快排和随机快排,并比较其排序时间。之后再对有序数组分别进行快排和随机快排,比较其性能。

    package quickSort;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Random;
    
    public class QuickSort {
    	final static int arrlength = 1000000;
    	static int arr[] = new int[arrlength];
    	static int a1[],a2[];
    	static SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");   
        static long between1;
    	static long between2;
        
    	public static void main(String[] args) throws ParseException{
    		int num=0;
    		QuickSort q = new QuickSort();
    		QuickSort s= new QuickSort();
    		for (int loop = 0;loop<10;loop++){
    			int count = 0;
    			Random random = new Random();
    			while(count<arrlength){
    				arr[count] = random.nextInt(1000);
    				count++;
    			}		
    			a1=arr.clone();
    			a2=arr.clone();
    //			q.printArr(arr);
    			java.util.Date begintime = dfs.parse(dfs.format(new Date()));
    			q.quick(a1,0,a1.length-1);		
    			java.util.Date middletime = dfs.parse(dfs.format(new Date()));
    			s.random(a2,0,a2.length-1);
    			java.util.Date endtime = dfs.parse(dfs.format(new Date()));
    	        between1=middletime.getTime()-begintime.getTime();
    	        between2=endtime.getTime()-middletime.getTime();
    			System.out.print("快速排序耗时:"+between1+"ms ");
    //			System.out.println();
    //			q.printArr(a1);
    	        System.out.println("随机快排耗时:"+between2+"ms ");
    //			q.printArr(a2);
    	        if(between1>between2)
    	        	num++;
    		}
    		 System.out.println("随机快排更快的次数:"+num);
    		 
    		 java.util.Date begintime = dfs.parse(dfs.format(new Date()));
    		 q.quick(a2,0,a1.length-1);		
    		 java.util.Date middletime = dfs.parse(dfs.format(new Date()));	
    		 s.random(a2,0,a2.length-1);
    		 java.util.Date endtime = dfs.parse(dfs.format(new Date()));
    		 between1=middletime.getTime()-begintime.getTime();
    		 between2=endtime.getTime()-middletime.getTime();
    		 System.out.println("对有序序列排序: ");
    		 System.out.println("快速排序耗时:"+between1+"ms ");
    //		 q.printArr(a2);
    		 System.out.println("随机快排耗时:"+between2+"ms ");
    //		 s.printArr(a2);
    	}
    	
    	public void quick(int[] a,int left,int right){
    		if (left>=right){
    			return;
    		}
    		int i = left;
    		for(int j = left; j < right;j++){
    			if(a[j]<a[right]){
    				swap(a,i,j);
    				i++;
    			}
    		}
    		swap(a,i,right);
    //		printArr(a);
    		quick(a,left,i-1);
    		quick(a,i+1,right);
    	}
    	
    	private void swap(int[] a,int i,int j){
    		int temp=a[i];
    		a[i]=a[j];
    		a[j]=temp;
    	}
    	
    	public void random(int[] a,int left,int right){
    		if(left >= right){
    			return;
    		}
    		Random r = new Random();
    		int index = (r.nextInt(right-left))+left;
    		swap(a,index,right);
    		quick(a,left,right);
    	}
    	
    	private void printArr(int[] a){
    	    for(int i=0;i<a.length;i++){
    	        System.out.print(a[i] + " ");
    	    }
    	    System.out.println();
    	}
    }
    

      输出结果:

     

    一百万的数据量任然太小,随机快排的效果并不明显(效率并不是确定的),但对于有序数组,随机快排明显要更快。

  • 相关阅读:
    Django+xadmin打造在线教育平台(八)
    Django+xadmin打造在线教育平台(七)
    Django+xadmin打造在线教育平台(六)
    Django+xadmin打造在线教育平台(五)
    Django+xadmin打造在线教育平台(四)
    Django+xadmin打造在线教育平台(三)
    Django+xadmin打造在线教育平台(二)
    Django+xadmin打造在线教育平台(一)
    Linux环境部署(一)
    centOS的联网问题
  • 原文地址:https://www.cnblogs.com/tlyx/p/6810058.html
Copyright © 2020-2023  润新知