快速排序
快速排序
- 归并是先一步步分到最小块,再归并归并归并归并
- 快排是排序俩侧,切分,排序俩侧,切分.......直到最小块就排完了
pubilc class Quick { public static void sort(Comparable[] a) { StdRandom.shuffle(a); // 消除对输入的依赖,随机打乱并输出乱序序列 sort(a, 0, a.length-1); } private static void sort(Comparable[] a, int lo, int i) { if(hi<=ho) return; int j = partition(a, lo, hi); //见后面的切分 sort(a, lo, j-1); sort(a, j+1, hi); //j为切分元素不用加进去了 } }
切分元素 j:先随意的选取a[lo]作为切分元素,然后从数组左端向左扫描找到一个大于等于a[lo]的数组,从数组右端扫描找到一个小于等于a[lo]的数组,然后交换这俩数组,如此扫描下去直到左右扫描数组相遇,相遇的即是切分元素,把切分元素与a[lo]交换就ok了!
private static int partiton(Comparable[] a, int lo, int hi) { int i = lo, j=hi+1; Comparable v = a[lo]; while(ture) { while(a[++i]<=a[lo]) if(i==hi) break; while(a[--j]>=a[lo]) if(j==lo) break; if(i>=j) break; swap(a, i, j); //交换a[i],a[j]的位置 } swap(a, lo, j); //交换a[lo],a[j]的位置 return j; }
java完整代码
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n=in.nextInt(); int []a=new int[n]; for(int i=0; i<n; i++) a[i]=in.nextInt(); sort(a); for(int i=0; i<n; i++){ System.out.print(a[i]); if(i!=n-1) System.out.printf(" "); } in.close(); } private static void sort(int[] a) { sort(a,0,a.length-1); } private static void sort(int[] a, int lo, int hi) { if(hi<=lo) return; int j = partiton(a, lo, hi); sort(a, lo, j-1); sort(a, j+1, hi); } private static int partiton(int[] a, int lo, int hi) { int i=lo, j=hi+1; while(true){ while(a[++i]<=a[lo]) if(i==hi) break; while(a[--j]>=a[lo]) if(j==lo) break; if(i>=j) break; int temp=a[i]; a[i]=a[j]; a[j]=temp; } int t=a[lo]; a[lo]=a[j]; a[j]=t;; return j; } }
c/c++完整代码(另一种)
#include<iostream> using namespace std; void quickSort(int *num,int left,int right) { if(left>=right) return; int midNum = num[(left + right) / 2]; int i = left; int j = right; while (i <= j) { while (num[i] < midNum) { i++; } while (num[j] > midNum) { j--; } if(i<=j) { swap(num[i], num[j]); i++; j--; } } quickSort(num,i, right); quickSort(num,left, j); } int main() { int n; cin>>n; int *num=new int[n]; for(int i=1;i<=n;i++) cin>>num[i]; quickSort(num,1,n); for(int i=1;i<=n;i++) cout<<num[i]<<" "; return 0; }
java
import java.util.Scanner; public class Main { private static void QuickSort(int []a,int lo,int hi) { int i=lo,j=hi; if(lo>=hi) return; int midNum=a[(lo+hi)/2]; while(i<=j) { while(a[i]<midNum) i++; while(a[j]>midNum) j--; if(i<=j) { int temp=a[i]; a[i]=a[j]; a[j]=temp; i++;j--; } } QuickSort(a,lo,j); QuickSort(a,i,hi); } /*private static void swap(int a,int b) { int temp=a; a=b; b=temp; }*/ public static void main(String[] args) { Scanner in = new Scanner(System.in); int n=in.nextInt(); int []a=new int[n]; for(int i=0; i<n;i++) a[i]=in.nextInt(); QuickSort(a,0,n-1); for(int i=0;i<n;i++) System.out.print(a[i]+" "); } }
三向切分的快速排序(比较适合大量重复的数据)
public class Quick3way { private static void sort(int []a,int lo,int hi) { if(lo>=hi) return; int It = lo,i=lo+1;gt=i; while(i<=gt) { if(a[i]<a[lo]) swap(a,i++,It++); else if(a[i]>a[lo]) swap(a,i,gt--); else i++; } sort(a,lo,It-1); sort(a,gt+1,hi); } }
天道酬勤!