快速排序 c

2021-04-22 03:24:32 字數 3350 閱讀 1515

快速排序應該是目前最快,也是最常用的一種排序演算法。它將乙個集合劃分成兩個子集合,然後繼續遞迴來完成最終排序。

具體做法:

1. 選取集合最右端的元素作為乙個參照物,稱之為 "樞紐" (pivot)。

2. 開始計算分割位置。在計算時,進行元素交換,確保左側元素都小於樞紐,而右側都大於樞紐。

3. 根據分割位置,分別遞迴左右兩段子集合,直至最終完成排序。

過程演示:

array = ;

第一輪呼叫:

1. 首先獲取最右側元素 0 作為樞紐。

2. 由於沒有比樞紐更小的元素,因此沒有發生內部交換。

3. 將樞紐和第乙個元素進行交換,確保 "左側" 都小於樞紐,"右側" 都大於樞紐。陣列變成 。

4. 返回分割位置: 0

第二次呼叫:

1. 右段子集合變成: ;

2. 獲取樞紐 2。

3. 左右遞推,我們找到右端第乙個小於樞紐的值 1,將其和左側第乙個大於樞紐的 9 進行交換,陣列變成 。

4. 交換樞紐位置,陣列變成 。

...我想你已經明白了快速排序的原理,接下來給出具體的實現**。

static void quicksort(int array, int left, int right)

static int partitionit(int array, int left, int right, int pivot)

; // 逆向迴圈,直到第乙個小於樞紐的元素位置(最後一位是樞紐,因此從 --rightptr 開始)。

while (rightptr > 0 && array[--rightptr] > pivot) ;

// 越界,跳出迴圈。

if (leftptr >= rightptr) break;

// 交換左右查詢到的元素,將小於樞紐的值交換到左側,大於樞紐的值交換到右側。

swap(array, leftptr, rightptr);

// 繼續迴圈,找下乙個大於或小於樞紐的元素進行交換。

}// 將最右端的樞紐交換到合適位置

swap(array, leftptr, right);

// 返回分界位置

return leftptr;

}static void swap(int array, int a, int b)

static void main(string args)

;quicksort(array, 0, array.length - 1);

var s = string.join(",", array.convertall(array, i => i.tostring()));

console.writeline(s);

}最後是老規矩,和其他排序演算法比較一下效能。

class program

static void recquicksort(int array, int left, int right)

static int partitionit(int array, int left, int right, int pivot)

;while (rightptr > 0 && array[--rightptr] > pivot) ;

if (leftptr >= rightptr) break;

swap(array, leftptr, rightptr);

}swap(array, leftptr, right);

return leftptr;

}static void swap(int array, int a, int b)

static void shellsort(int array)

while (h > 0)

array[inner] = temp;

}h = (h - 1) / 3;}}

static void main(string args)

-------------", length);

int array = new int[length];

var ran = new random();

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

action> sort = (arr, func) =>

: ",

func != null ? func.method.name : "array.sort",

watch.elapsedmilliseconds);

};var a1 = array.clone() as int;

var a2 = array.clone() as int;

var a3 = array.clone() as int;

sort(a1, quicksort);

sort(a2, shellsort);

sort(a3, null);}}

}輸出:

-10000-------------

quicksort: 1

shellsort: 2

array.sort: 1

-20000-------------

quicksort: 3

shellsort: 4

array.sort: 2

-30000-------------

quicksort: 4

shellsort: 7

array.sort: 4

-40000-------------

quicksort: 6

shellsort: 11

array.sort: 5

-50000-------------

quicksort: 8

shellsort: 13

array.sort: 7

你發現了什麼?除了比希爾排序強以外,快速排序似乎和 array.sort 有某種關聯。趕緊去看看……

[reliabilitycontract(consistency.maycorruptinstance, cer.mayfail)]

public static void sort(array array)

[reliabilitycontract(consistency.maycorruptinstance, cer.mayfail)]

public static void sort(array keys, array items, int index, int length, icomparer comparer)

if ((objarray != null) && ((items == null) || (objarray2 != null)))

else}}

原來 array.sort() 方法內部使用的就是快速排序演算法。

排序 快速排序(C )

1 演算法描述 1.1 設當前參加排序的陣列為array 0.n 1 選擇乙個元素 通常稱該元素為基準元素 作為基準元素 將小於或者等於基準元素的所有元素都移到基準元素的左邊 把大於或者等於基準元素的所有元素都移到分界元素的右邊 執行完 2 3 步驟後,基準元素左邊元素序列,基準元素,基準元素右邊元...

排序 快速排序(C )

如果看不懂這些乾巴巴的理 字,那就先不用看了,下面 中有詳細的注釋,大家可以先跟著 走幾遍,回過頭來再看這些文字描述,總之 紙上得來終覺淺,絕知此事要躬行。排序演算法哪家強,從實際應用的角度上將,快排表現很好。很自然地,人們會覺得短陣列比長陣列更好處理,因此可能會想到將原始陣列分為若干各子部分然後分...

快速排序C

1.快速排序 include void run int pdata,int left,int right while i j 如果兩邊掃瞄的下標交錯,就停止 完成一次 當左邊部分有值 lefti 遞迴右半邊 if right i run pdata,i,right void quicksort in...