快速排序思想:
1.找基準:定義high,low,temp,先讓tmp=low值,從high位置開始找比tmp小的值,沒有就high–,有就讓low值等於high值,然後從low位置開始找比tmp大的值,沒有就low++,有就讓high值等於low值,然後又從high位置開始找比tmp小的值,以此類推,直到high和low相遇跳出返回low下標(此時的基準)
找基準全程都是和tmp值(就是基準值)作比較,一次找基準後,基準左側都是比基準小的數,基準右側都是比基準大的數,但還是無需的。
2.根據基準判斷是否需要繼續排序:基準兩側只剩下乙個元素時就不用找基準了(已有序)
快速排序時間複雜度 o(n*log2n) 最慢o(n^2)
快速排序的時間複雜性分析:排序的大體如下圖所示,假設有1到8代表要排序的數,快速排序會遞迴log2(8)=3次,每次對n個數進行一次處理,所以他的時間複雜度為n*log2(n)。所以排序問題的時間複雜度可以認為是對排序資料的總的操作次數。
public class fastsort
if(low >= high)else
while(low=high)else
} array[low]=tmp;
return low;
}
找基準三種方法:
固定位置法:low值就是最後的基準值,萬一low值剛好是所有元素最小值(或者元素剛好是有序),第一次找基準過程就相當於什麼都沒做
//1. 固定位置法
public static void quick(int array,int low,int high)
if(par隨機基準法:元素中隨機找乙個數,並賦給low,避免固定位置法的不足之處
//2.隨機基準
public static void new_quick1(int array,int low,int high)
if(par三分取基準:找出low和high下標的中值mid,mid值放在low位置,low值放在mid位置,這樣就會盡可能的讓乙個中間大小的值成為了tmp值(基準值)
//3. 三分取基準
/*函式作用:取待排序序列中low、mid、high三個位置上資料,選取他們中間的那個資料作為樞軸*/
public static int med(int array,int low,int high)
if (array[low] > array[high])
if (array[mid] > array[low])
//此時,array[mid] <= array[low] <= array[high]
return array[low];
//low的位置上儲存這三個位置中間的值
//分割時可以直接使用low位置的元素作為樞軸,而不用改變分割函式了 }
}public static void new_quick2(int array,int low,int high)
if(par < high-1)
}
快排優化1:元素少時直接用直接插入
//優化1.元素少時用直接插入
public static void insrtsort(int array,int low,int high) else
}array[j+1] = temp;
}} public static void new_quick3(int array,int low,int high)else
if(par < high-1)
}}
快排優化2:聚集相同元素將基準左右兩側和基準相同的元素聚集起來,接著給基準相同元素兩末端以外的元素繼續排序
//優化2.聚集相同的元素
public static void new_quick4(int array,int low,int high)
if(par < high-1)
}private static int focusnum(int array, int low, int high, int par,
int left, int right) else}}
left = par_left;
//右邊找
for(int i = par+1;i <= high;i++)else}}
right = par_right;
int a = new int[2];
a[0] = left;
a[1] = right;
return a;
}
排序演算法 快速排序原理及Java實現
和以前的寫法對比,基準值所在的位置沒必要每次都進行交換,只在一次快排完成後,重新把當前的基準值賦值給現在的index位置就好了。寫的很強,感謝作者 public class quicksort i low j hight index a i 用子表的第乙個記錄做基準 while i j a i in...
排序演算法 氣泡排序及優化 Java實現
氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端。1.1 演算法描述 1.2 演示 基本的氣...
排序演算法 快速排序 java實現
它採用了一種分治的策略,通常稱為分治法。分治法思想 將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞迴地解這些子問題,然後將這些子問題的解組合為原問題的解。對於陣列a,隨機選擇乙個元素作為基準數pos,一般為第乙個元素或最後乙個元素。將該陣列分為兩堆a 0,pos index 1 和 a ...