氣泡排序:
屬於交換排序的一種。
很好理解的交換排序是這樣的:
這個演算法的邏輯是從頭到尾掃瞄元素,將這個元素和它後面的所有元素進行比較,如果有比它更小的,那就交換,最後交換的一定是最小的,然後元素指標i後移,再比較它後邊的所有元素。for (int i = 0; i
< n; ++i)
for (int j = i+1; j
< n; ++j)
冒泡演算法和這個演算法類似,不同之處就在於兩個for迴圈,它是交換相鄰兩個元素,完成一次內迴圈,最大的元素就跑到了最後乙個位置。**為:
第一層for迴圈用來控制已經排好序的元素,第二層for迴圈,用來將未排好序的元素相鄰元素比較。迴圈次數中,為什麼要減一呢,那是因為元素要和它下乙個元素比較,如果不減一,陣列下標就會越界。for (int i = 0; i
< n - 1; ++i)
for (int j = 0; j
< n - i -1; ++j)
歸併排序:
這個排序是用遞迴來做的。需要定義乙個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++];
}
這裡需要注意的是,last指標指的是最後乙個元素。void mergesort(int nums, int first, int
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 基本思想 從無序序列頭部開始,進行兩兩比較,根據大小交換位置,直到最後將最大 最小 的資料元素交換到了無序序列的隊尾,從而成為有序序列的一部分 下一次繼續這個過程,直到所有資料元素都排好序。演算法的核心在於 每次通過兩兩比較交換位置。選出剩餘無序序列裡最大 最小 的資料元素放到隊尾...