快排兩種方法
阿新 • • 發佈:2019-01-04
方法一:先從右向左找比base小的數,再從左向右找比base大的數,最後是比base小的數在左邊,比base大的數在右邊。
方法二:從左向右遍歷,分為 小於區--等於區--大於區,再依次遞迴小於區和大於區
void qSort(int *A, int l, int r){ if(l<r){ int i=l; int j=r; int base=A[l]; int tmp; while(i<j){ while(i<j&&base<=A[j]){ j--; } while(i<j&&base>=A[i]){ i++; } if(i<j){ tmp=A[j]; A[j]=A[i]; A[i]=tmp; } } A[l]=A[i]; A[i]=base; qSort(A,l,i-1); qSort(A,i+1,r); } }
方法二:從左向右遍歷,分為 小於區--等於區--大於區,再依次遞迴小於區和大於區
void swap(int arr[],int i, int j){ int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } void partition(int a[],int l, int r,int *lef,int *rgt){ int less=l-1; int more=r; while(l<more){ if(a[l]<a[r]){ swap(a,++less,l++); }else if(a[l]>a[r]){ swap(a,--more,l); }else{ l++; } } swap(a,more,r); *lef=less+1; *rgt=more; } void quicksort(int a[],int l,int r ){ if(l<r){ int lef,rgt; partition(a,l,r,&lef,&rgt); quicksort(a,l,lef-1); quicksort(a,rgt+1,r); } }