排序演算法 氣泡排序,歸併排序,快速排序

2021-07-22 05:27:02 字數 1807 閱讀 3393

氣泡排序:

屬於交換排序的一種。

很好理解的交換排序是這樣的:

for (int i = 0; i

< n; ++i)

for (int j = i+1; j

< n; ++j)

這個演算法的邏輯是從頭到尾掃瞄元素,將這個元素和它後面的所有元素進行比較,如果有比它更小的,那就交換,最後交換的一定是最小的,然後元素指標i後移,再比較它後邊的所有元素。

冒泡演算法和這個演算法類似,不同之處就在於兩個for迴圈,它是交換相鄰兩個元素,完成一次內迴圈,最大的元素就跑到了最後乙個位置。**為:

for (int i = 0; i

< n - 1; ++i)

for (int j = 0; j

< n - i -1; ++j)

第一層for迴圈用來控制已經排好序的元素,第二層for迴圈,用來將未排好序的元素相鄰元素比較。迴圈次數中,為什麼要減一呢,那是因為元素要和它下乙個元素比較,如果不減一,陣列下標就會越界。

歸併排序:

這個排序是用遞迴來做的。需要定義乙個merge()函式(歸併函式),這個函式的目的是將兩個陣列歸一為乙個有序陣列。這個merge()函式的引數有待排序陣列nums, 第乙個元素下標,中間元素下標,最後乙個元素下標。merge函式定義如下:

void merge(int nums, int first, int mid, int last)

// 歸併完了之後,要判斷誰還有剩下的,將剩下的放到陣列temp中

while (i <= mid)

temp[k++] = nums[i++];

while (j <= last)

temp[k++] = nums[j++];

// 然後將temp中的值拷貝到原陣列中

i = first;

k = 0;

while (i <= last)

nums[i++] = temp[k++];

}

上邊是歸併排序的歸併部分。還需要定義乙個歸併排序函式,用來做遞迴用。

void mergesort(int nums, int first, int

last)

這裡需要注意的是,last指標指的是最後乙個元素。

快速排序:

快速排序的核心就是有乙個pivot,我們叫它「基準」。快速排序和歸併排序一樣,也是用遞迴來實現的。

做法是: 先定義兩個指標i,j。i指向第乙個元素,j指向最後乙個元素。先將pivot於j所指向的元素比較,若比它大,j--,若比它小,把j所指向的元素給i,i++;再開始pivot和i所指向的元素比較,若i所指向的元素比pivot大,則將i所指向的元素賦給j,j--。

也就是說先從後向前掃瞄,找到比它小的,再掉轉方向,從前往後掃瞄,找打比它大的,再掉轉方向,直到i和j相遇,演算法結束。

void quicksort(int nums, int first, int

last)

nums[i] = pivot;

quicksort(nums, first, i - 1);

quicksort(nums, i + 1, last);

}

這裡需要注意的是:

1. 必需有遞迴結束函式

2. 每掃瞄一次,也要判斷一次i是否小於j

3. 如果元素等於基準,就不移動。

打拳時間到了,先記錄這三個演算法吧。

若有不對之處,敬請指正。

演算法之常見排序演算法 氣泡排序 歸併排序 快速排序

引言 對於程式設計中琳琅滿目的演算法,本人向來是不善此道也不精於此的,而說起排序演算法,也只是會氣泡排序。還記得當初剛做開發工作面試第一家公司時,面試官便讓手寫氣泡排序 入職之後才知道,這面試官就是乙個氣泡排序 病態 愛好者,逢面試必考氣泡排序 後來看吳軍的一些文章,提到提高效率的關鍵就是少做事情不...

排序演算法 氣泡排序 快排 歸併排序

氣泡排序 bubble sort 也是一種簡單直觀的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。步驟 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同...

氣泡排序,快速排序,堆排序,歸併排序

1.氣泡排序 1 基本思想 從無序序列頭部開始,進行兩兩比較,根據大小交換位置,直到最後將最大 最小 的資料元素交換到了無序序列的隊尾,從而成為有序序列的一部分 下一次繼續這個過程,直到所有資料元素都排好序。演算法的核心在於 每次通過兩兩比較交換位置。選出剩餘無序序列裡最大 最小 的資料元素放到隊尾...