排序演算法(一) 快速排序 quicksort

2021-08-24 18:00:24 字數 2037 閱讀 7104

在陣列中任取乙個元素作為樞紐元(pivot),將陣列中除了樞紐元以外的元素劃分成兩個集合:乙個集合 s1 中的元素大於樞紐元,另乙個集合 s2 中的元素小於樞紐元。對兩個集合分別進行 quicksort(遞迴),最後返回較小數集合+樞紐元+較大數集合的陣列。

平均執行時間為 o(n log n)

最長執行時間為 o(n^2)

如果輸入的陣列不是隨機的,就不應該選取第乙個元素或最後乙個元素作為樞紐元。如果輸入的陣列是預排序的或者反序的,那麼所有元素都會被劃分到 s1 或者 s2,而且之後的每次都是如此,花費的時間會是二次的。

一般使用三數中值分割法:即選擇第乙個元素,中間位置的元素和最後乙個元素的中位數作為樞紐元。

package chapter7.quicksort;

public

class

quicksort ;

long s=system.nanotime();

arr = quicksort(arr);

long e=system.nanotime();

print(arr);

system.out.println("time:"+(e-s)+"ns");

int arr1 = ;

s=system.nanotime();

arr1=sort(arr1);

e=system.nanotime();

print(arr1);

system.out.println("time:"+(e-s)+"ns");

}private

static

void

print(int arr)

}/*快速排序*/

private

static

int quicksort(int arr)

int position=0; //樞紐元位置

int pivotarr=new

int[3];

pivotarr[0]=arr[0];

pivotarr[1]=arr[arr.length/2];

pivotarr[2]=arr[arr.length-1];

int newpivotarr=sort(pivotarr);

int pivot=newpivotarr[1]; //取樞紐元

if (pivot==pivotarr[0]) else

if (pivot==pivotarr[1]) else

//int pivot = arr[0];

/*計算較小數集合的大小*/

for (int i = 0; i < length; i++)

if (arr[i] < pivot)

}int arrl = new

int[l];

int arrr = new

int[length - l - 1];

int countl = 0;

int countr = 0;

/*劃分較大數集合和最小數集合*/

for (int i = 0; i < length; i++)

if (arr[i] < pivot) else

}arr[position] = arr[countl];

arr[countl] = pivot; //確定樞紐元排序後的位置

/*集合中元素個數大於3,使用quicksort,否則用氣泡排序*/

if (countl > mark) else

if (countr > mark) else

/*把兩個集合與樞紐元拼接起來*/

for (int i = 0; i < countl; i++)

for (int i = countl + 1; i < length; i++)

return arr;

}/*氣泡排序*/

private

static

int sort(int arr) }}

return newarr;

}}

排序演算法(一) 快速排序

突然覺得在本科的時候自己的基本功練習的不是很過關,趁著學python的熱乎勁好好把基礎演算法過一過,等以後面試的時候也不會死的太慘。快速排序 quicksort 快速排序的可以說是在資料量較大且資料夠隨機的情況下,平均時間複雜度最好的演算法,如果你沒辦法判斷待排序資料的隨機度和規模,用quickso...

排序演算法一 快速排序

package math 快速排序 思路 使用兩個座標指標low,high 和基準值 key為第乙個值 low 初始化時設定序列的頭和尾為low,high。從high開始比較key,如果比key小則交換位置,然後從low比較key如果大於key則交換位置 如此反覆執行 author cyd publ...

排序演算法之一 快速排序

1 先從數列中取出乙個數作為基準數。2 分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。3 再對左右區間重複第二步,直到各區間只有乙個數。1 預排序的輸入非常常見,因此不要選擇第乙個數作為基準數 2 隨機數的生成也較為昂貴 3 採用三數中值分割法 取左中右三個元素的中值作...