氣泡排序 快速排序

2021-10-09 00:14:55 字數 3861 閱讀 6055

氣泡排序和快速排序都是一類借助交換進行排序的方法,快速排序是比較簡單的一種。

氣泡排序首先將第乙個記錄的關鍵字和第二個記錄的關鍵字進行比較,如果第乙個記錄的關鍵字大於第二個記錄的關鍵字則將這兩個記錄的位置進行交換。然後比較第二個記錄的關鍵字和第三個記錄的關鍵字並進行同樣的操作。直到比較完第n−1

n-1n−

1個記錄的關鍵字和第n

nn個記錄的關鍵字,以上過程稱為第一趟氣泡排序,它使得n個記錄中關鍵字最大的記錄被放在第n(從1開始計數)個記錄的位置上。然後進行第二趟氣泡排序,對前n−1

n-1n−

1個記錄進行同樣的操作使得n個記錄中關鍵字第二大的記錄被放在第n−1

n-1n−

1個記錄的位置上。整個排序過程需要經過k(1

<=k

k(1<=kk(

1<=k

氣泡排序。判斷氣泡排序結束的條件是一趟氣泡排序的過程中沒有發生記錄位置的交換。乙個氣泡排序的例子見圖1(從小到大排序)。

如果初始序列為正序(即原有序列中記錄已經按照關鍵字從小到大有序),則只需進行一趟氣泡排序,在排序過程中進行n−1

n-1n−

1次關鍵字的比較且不需要進行記錄位置的互換。如果初始序列為逆序(即原有序列中記錄按照關鍵字從大到小有序),則需要進行n−1

n-1n−

1趟氣泡排序,需要進行∑i=

n2(i

−1)=

1+2+

3+..

.+(n

−1)=

n(n−

1)2\sum\limits_^(i-1)=1+2+3+...+(n-1)=\frac

i=n∑2​

(i−1

)=1+

2+3+

...+

(n−1

)=2n

(n−1

)​次關鍵字的比較以及同數量級的記錄位置交換。因此總的時間複雜度為o(n

2)o(n^2)

o(n2)。

void
recordexchange

(int

&a,int

&b)void

bubblesort

(int record,

int n)}}

}

//測試程式

intmain()

;bubblesort

(record,7)

;for

(int i =

0; i <

7; i++

)}

快速排序是對氣泡排序一種改進。它首先任選乙個記錄(通常是第乙個記錄,從1開始計數)作為樞軸(或支點,pivot),然後將比該記錄關鍵字小的記錄放在該記錄的位置之前,將將比該記錄關鍵字大的記錄放在該記錄的位置之後。這樣就以該樞軸為分界線將原序列劃分為了兩個子串行。這一過程稱為一趟快速排序。之後再遞迴的對兩個子串行進行同樣的操作直到子串行中的記錄的個數小於等於1時為止。

一趟快速排序的具體做法是,附設兩個指標low

lowlo

w和high

high

high

,初始時它們分別指向序列的第乙個記錄和最後乙個記錄。演算法首先從hig

hhigh

high

指向的位置向前搜尋找到第乙個關鍵字小於piv

otpivot

pivo

t的關鍵字的記錄並和記錄piv

otpivot

pivo

t交換位置,然後從從low

lowlo

w指向的位置向後搜尋找到第乙個關鍵字大於piv

otpivot

pivo

t的關鍵字的記錄並和記錄piv

otpivot

pivo

t交換位置,重複這兩步直到low

=hig

hlow=high

low=hi

gh為止就完成了一趟快速排序。乙個快速排序的例子見圖2。

以下**參考於這裡

// a utility function to swap two elements  

void

swap

(int

* a,

int* b)

/* this function takes last element as pivot, places

the pivot element at its correct position in sorted

array, and places all smaller (smaller than pivot)

to left of pivot and all greater elements to right

of pivot */

intpartition

(int arr,

int low,

int high)

}swap

(&arr[i +1]

,&arr[high]);

return

(i +1)

;}/* this function takes first element as pivot, places

the pivot element at its correct position in sorted

array, and places all smaller (smaller than pivot)

to left of pivot and all greater elements to right

of pivot */

intpartition

(int arr,

int low,

int high)

arr[low]

= arr[high]

;while

(low < high && arr[low]

<= pivot)

arr[high]

= arr[low];}

arr[low]

= temp;

return low;

}/* the main function that implements quicksort

arr --> array to be sorted,

low --> starting index,

high --> ending index */

void

quicksort

(int arr,

int low,

int high)

}/* function to print an array */

void

printarray

(int arr,

int size)

//測試程式

intmain()

;int n =

sizeof

(arr)

/sizeof

(arr[0]

);quicksort

(arr,

0, n -1)

; cout <<

"sorted array: \n"

;printarray

(arr, n)

;return0;

}

排序 氣泡排序 快速排序

快速排序 氣泡排序就是自上向下依次對比兩個數字,若上面的數字大於下面的數字,則兩者交換,否則不交換。這樣每次迴圈結束,未排序的最大的數就到了最下面。如陣列前兩次迴圈過程如下 快速排序的核心是partition 函式,其功能如下所示 34的位置找到後,其將陣列分成兩部分,前一部分都比34小,後一部分都...

排序 氣泡排序 快速排序

1 基本思想 將第乙個記錄的關鍵字與第二個記錄的關鍵字比較,若為逆序,則將兩個記錄交換,再向後比較。關鍵字小的漂浮,關鍵字大的下沉。2 穩定性 演算法穩定。3 時間複雜度 o n 空間複雜度 o 1 4 實現 include define n 5 陣列長度上限 intmain printf 氣泡排序...

排序(氣泡排序 快速排序

關於排序的穩定性 在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中r i r j 且r i 在r j 之前,而在排序後的序列中,r i 仍在r j 之前,則稱這種排序演算法是穩定的 否則稱為不穩定的。一 氣泡排序 氣泡排序的基本思想 每次比較...