快速排序
2016-08-08 09:18
225 查看
几经周折,虽然还是有点bug,但是理解快速排序的内容啦。
快速排序,首先就是要先找到一个中间的标准(主元),然后把主元放在序列的最后,分别从前到后和从后到前将其他数字与主元进行比较,以达到分段的目的。
最坏运行时间:当输入数组已排序时,时间为O(n^2)。
最佳运行时间:O(nlgn)。
快速排序,首先就是要先找到一个中间的标准(主元),然后把主元放在序列的最后,分别从前到后和从后到前将其他数字与主元进行比较,以达到分段的目的。
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(; 4000 ;){ 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 ; 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)。