快速排序演算法及優化(Java實現)

2021-09-13 09:04:04 字數 2439 閱讀 5389

快速排序思想:

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 ...