java中的快速排序
阿新 • • 發佈:2019-01-05
我們先來舉列子瞭解一下快速排序:
如圖,我們以隊伍第一個元素為基準,然後我們從後面找比基準大的值後,將他的值
放到基準的位置(注意 原位置還是他的值)
一次後:
第二次:
第三次:
第四次:
最後一次:
當兩邊的指標重合時,將基準放的那個位置,然後一次快速排序結束,
結束後的結果是,基準左側,全是比他小的,基準右側全是比他大的。
而遞迴就是一次快速排序後,兩邊遞迴子序列快排,函式實現:
public static int partio1(int []array,int low,int high ){ int tmp = array[low]; while(low<high){ while(low<high&& array[high]>=tmp){ --high; } if(low >=high){ break; }else{ array[low] = array[high]; } while(low<high&&array[low]<=tmp){ ++low; } if(low>=high){ break; }else{ array[high] =array[low]; } } array[low] = tmp; return low; } public static void Quick(int array[],int start,int end){ int par = partio1(array,start,end); if(par > start+1){ Quick(array,0,par); } if(par <end-1){ Quick(array,par+1,array.length-1); } } public static void Quicksort(int array[]){ Quick(array,0,array.length-1); }
非遞迴:
這是一次快排後的結果,我們將,基準兩側控制範圍的下標入棧。
0到4是基準左側的下標範圍,6到8是基準右側的下標範圍,然後讓8和6出棧,對這
個範圍的子問題快排,如若大於一個元素,繼續入棧,知道有序,類似遞迴,再讓右
邊有序,最終使得序列有序。
程式碼:
public static int partion(int[] array,int low,int high){ int point = array[low]; while(low < high){ while(low < high && array[high] >= point){ high--; } if(low >= high){ break; }else{ array[low] = array[high]; } while(low < high && array[low] <= point){ low++; } if(low >= high){ break; }else{ array[high] = array[low]; } } array[low] = point; return low; } public static void Quicks(int[] array){ int[] stack = new int[array.length]; int top = 0; int low = 0; int high = array.length-1; int par = partion(array,low,high); //入棧 if(par > low+1){ stack[top++] = low; stack[top++] = par-1; } if(par < high-1){ stack[top++] = par+1; stack[top++] = high; } //出棧 while(top > 0){ high = stack[--top]; low = stack[--top]; par = partion(array,low,high); if(par > low+1){ stack[top++] = low; stack[top++] = par-1; } if(par < high-1){ stack[top++] = par+1; stack[top++] = high; } } }