快速排序

来源:互联网 发布:分销网络 编辑:程序博客网 时间:2024/05/10 12:35

几经周折,虽然还是有点bug,但是理解快速排序的内容啦。
快速排序,首先就是要先找到一个中间的标准(主元),然后把主元放在序列的最后,分别从前到后和从后到前将其他数字与主元进行比较,以达到分段的目的。

import java.util.Scanner;public class Quick {    //交换两个整数    private static void swap(int a,int b){        System.out.println("a="+a+" b="+b);        int temp;        temp=b;        b=a;        a=temp;        System.out.println("a="+a+" b="+b);    }    //找主元,并把它放在数组的最后位置    private static int pivotKey(int num[],int left,int right){//left=0;right=num.length-1;        int temp;        int mid=(left+right)/2;        int a=num[left];        int b=num[mid];        int c=num[right];        System.out.println(a+":"+b+":"+c);        if(a>b){            temp=b;            b=a;            a=temp;        }        System.out.println(a+":"+b+":"+c);        if(c<=a){            swap(num[left],num[right]);            return a;        }        else if(c>=b){            swap(num[mid],num[right]);            return b;        }        else{            return c;        }    }    public static void quicksort(int num[],int left,int right){         int pivot=pivotKey(num,left,right);        System.out.println(pivot);        int i=left;        int j=right;        for(;;){            while(i<=right&&num[i]>pivot){                i++;            }            while(j>=0&&num[j]<pivot){                j--;            }            if(i<j){                int temp;                temp=num[i];                num[i]=num[j];                num[j]=temp;            }            else{                break;            }        }        if(j-left>2){            quicksort(num,left,j-1);        }        if(right-i>2){            quicksort(num,i+1,right);        }        System.out.println(right);    }    public static void main(String []args){        int n;        Scanner s=new Scanner(System.in);        n=s.nextInt();        int[] a=new int[n];        for(int i=0;i<n;i++){            a[i]=s.nextInt();        }        //System.out.println(pivotKey(a,0,n-1));        quicksort(a,0,n-1);        for(int i=0;i<n;i++){            System.out.print(a[i]+" ");        }    }}

最坏运行时间:当输入数组已排序时,时间为O(n^2)。
最佳运行时间:O(nlgn)。

0 0
原创粉丝点击