常用排序演算法之快速排序

2021-07-31 15:50:09 字數 3097 閱讀 8257

快速排序:

快速排序也是一種分治的遞迴演算法。

取陣列s中任一元素v,作為樞紐元。用樞紐元將s中的元素分成倆部分,對這兩部分分別再次進行快速排序。當s中元素個數是0或1時,則返回。因為快速排序要根據樞紐元將元素分成倆部分,因此,樞紐元的選取對程式的時間複雜度是有影響的。一般的樞紐元選取策略是取左端、右端和中間位置上的三個元素的中值作為樞紐元。

#include

using

namespace

std;

typedef

intelementtype

;void

print

(inta,

intn

)cout

<<

endl;}

void

swap

(elementtype

*lhs

,elementtype

*rhs

)void

insertionsort

(elementtypea[

],intn )

}elementtype

median3

(elementtypea[

],int

left

,int

right

)#define

cutoff(3

)//確保有三個元素用於查詢樞紐元

void

qsort

(elementtypea[

],int

left

,int

right

)//先將i+1,移過左端第乙個,再和樞紐元進行比較,因為在選擇樞紐元的時候已經將a[left]與樞紐元比較過了,而且

while(a

[--j ]

>

pivot

)//先將j-1,移過右端第二個,再和樞紐元進行比較,因為在選擇樞紐元的時候已經將右端第二個與樞紐元比較過了if(

i swap(&

a[i ],&a

[j ]);

//將i移過小於樞紐元的元素,將j移過大於樞紐元的元素。若i仍然小於j。就交換指標i和j所在的元素。

else

break

;//否則就結束。

}swap(&

a[i ],&a

[right-1

]);//將樞紐元放到左右部分元素交匯處。

qsort(a

,left,i

-1);對左右部分遞迴呼叫快速排序

qsort(a

,i +1

,right);}

else

/* do an insertion sort on the subarray */

insertionsort(a

+left

,right

-left+1

);}void

quicksort

(elementtypea[

],intn )

intmain();

print(a

,10);quicksort(a

,10);print(a

,10);system

("pause"

);return0;

}

十個元素:

先找出第乙個位置、最後乙個位置以及中間位置處的元素的中間值[(left+right)/2]向下取整作為樞紐元,找到樞紐元與最後乙個位置處的值交換。

初始時刻i指向第乙個元素,j指向倒數二個元素,最後乙個位置存放的是樞紐元。此時,i所指向的元素大於樞紐元,停止。j往前移動指向2,j所指向的元素小於樞紐元,停止。將i和j所指向的值進行交換。

i向後移動,直到i指向9,大於樞紐元,停止。j往前移動指向5,j所指向的元素小於樞紐元,停止。將i和j所指向的值進行交換。

這時,i繼續向後移,移過那些小於樞紐元的元素,直到i指向9,大於樞紐元,停止。j向前移移過大於樞紐元的元素,直到j指向3,小於樞紐元,停止。

此時i>j.i以後的元素全部大於樞紐元,i以前的元素全部小於樞紐元。因此,不再交換。

這時,整個陣列被樞紐元分成倆部分,第一部分:left到i-1位置上的元素均小於樞紐元。第二部分:i+1到right部分的元素均大於樞紐元。分別對這兩部分再次進行快速排序。最終得以將陣列全部排好序。

簡易演算法實現:

#includeusing namespace std;

#define max 255

void quicksort(int *a,int left, int right)

else

break;

} temp = a[left];

a[left] = a[j];

a[j] = temp;

quicksort(a,left,j-1);

quicksort(a, j+1, right);

}int main()

quicksort(a,0, n-1);

cout << "經過排序後的陣列為:" << endl;

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

}

常用排序演算法之快速排序

快速排序最壞情況執行時間為o n2 但實際中通常都是用於排序的最佳的實用選擇,因為其平均效能相當好 期望的執行時間為o nlgn 且o nlgn 記號中隱含的常數因子很小。快速排序是一種就地排序。同時,是一種不穩定的排序。本文內容主要參照演算法導論。快速排序主要利用了分治的思想。一般分為三步進行 分...

常用演算法之快速排序

演算法對開發的重要性不言而喻,所以準備記錄一些常用演算法。本篇文章先介紹一下快速排序演算法。這是在實際中最常用的一種排序演算法,速度快,效率高。快速排序是非常優秀的排序演算法。它是由是c.r.a.hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略,屬於分治法 divide and ...

排序演算法之快速排序

快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 從數列中挑出乙個元素,稱為 基準 pivot 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽退出...