演算法 演算法 冒泡,選擇,插入排序演算法

2021-09-06 10:41:52 字數 2732 閱讀 9207

小續

演算法只是一種思想,在很大程度上,其實現都依賴於資料結構,所以這裡提取出一些典型的演算法和資料結構,包括排序以及鍊錶/堆疊/佇列等結構的操作

冒泡法排序

陣列中有n個整數,用冒泡法將他們從小到大(或從大到小)排序。

例項解析:

排序是非常重要且很常用的一種操作,有氣泡排序、選擇排序、插入排序、希爾排序、快速排序、堆排序等多種方法。這裡我們先簡單介紹前三種排序演算法和**的實現,其餘演算法將在後續課程《資料結構》中學習到。

冒泡法排序是c語言教材中已經介紹過的排序方法,與其他排序方法比較起來,冒泡法效率是最低的,但因其演算法簡單,故也常被採用,其演算法是:

(1)從第乙個數開始,相鄰兩個數兩兩比較,將大的(或小的)交換到後面,然後繼續比較第2、3個數…..當比較完最後兩個數的時候,最大數(或最小數)便排在最後了。此過程稱為「一趟」。

(2)將最大數排除在外,其餘數重複步驟1。

(3)重複步驟2,直到所有數都排好為止。

對於有n個數的排序,上面的過程總共需要進行n-1趟。

下面是冒泡法排序的**:

#include #define  n 10

int main()

, i, j, t;

for(i = 0; i < n-1; i++)

}for(i = 0; i <= n-1; i++)

printf(「%3d」, a[i]);

printf(「\n」);

getch();

return 0;

}

選擇法排序

陣列中有n個整數,用選擇法將他們從小到大排序。

例項解析:

選擇法是被較多採用的一種排序方法,其效率比冒泡法高(交換資料的次數少),而演算法卻並未複雜多少。

選擇法排序總的思路是:

1、找出乙個最小數,交換到最前面。

2、在剩下的數裡面,再找乙個最小的,交換到剩下數的最前面

3、重複步驟2 ,直到所有數都已排好。

顯然,對於含有n個數的陣列來說,其過程也要進行n-1趟 ( 0 <= i < n-1 )。

上面所述步驟中,「找出乙個最小數,交換到最前面」的方法是:

先將剩下數中的第乙個數(序號是i)作為擂主,用變數k記下其序號,後面的數依次與擂主(注意:擂主是a[k],不總是a[i])比較,若比擂主還小,則用k記下其序號(注意:此時不要交換),當所有數都與擂主比較後,k中存放的就是最小數的序號,然後將它交換到最前面(現在才交換)。在上面的過程中,資料只交換了一次,即每趟只交換一次資料。

**如下:

#include #define  n 10

int main()

, i, j, k, t;

for(i = 0; i < n-1; i++)

for(i = 0; i <= n-1; i++)

printf(「%3d」, a[i] );

printf(「\n」);

getch();

return 0;

}

插入排序

陣列中有n個整數,用插入排序實現他們由小到大的排列。

例項解析:

插入排序也是常用的一種排序方法,效率較冒泡法高(一趟即可完成),但比選擇法低(移動資料次數多)。其基本思想是:將陣列分成兩個區:前面是已排序的區域(有序區),後面是沒有排序的區域(無序區)。每次都從無序區中取第乙個數插入到有序區中適當位置,直到所有資料插入完畢為止。

演算法的具體描述是:

待排序的資料存放在陣列a[0, 1, ...n-1]中,未排序前,a[0]自己是乙個有序區,a[1, 2, ...n-1]是無序區。程式必須從i = 1開始,直到i = n-1為止,每次將a[i]插入到有序區中。

插入排序與打撲克摸牌時的理牌過程很相似,當摸來第一張牌時,不需要排序,本身就是排好的(就一張),從第二張開始,每次摸來一張牌,必須插入到原來有序的撲克牌中的適當位置,而為了找到這個適當位置,需要將新摸來的牌與手中的牌進行比較。

基本的插入排序:

首先在有序區a[0,1,...i-1]中查詢a[i]應該插入的位置k(0 <= k <= i-1),然後將a[k,k+1,...i-1]中的資料各自後移乙個位置,騰出位置k插入a[i]。

若有序區所有資料均小於a[i]時,a[i]就應該在原位置不變,不需要插入。

改進後的插入排序:

將待插入的資料a[i]自右至左依次與有序區的資料a[i-1,i-2,...0]進行比較,若a[i]小於某資料a[j],則a[j]後移乙個位置,繼續與前面的資料比較......直到遇到比a[i]小的資料或前面已沒有資料,則插入位置確定。

若碰到乙個資料a[j]比a[i]小,則a[i]應插入到位置j+1。

若a[i-1]比a[i]小,則a[i]位置不變。

若所有資料都比a[i]大,則a[i]應插入到位置0。

下面是改進後插入排序的**:

#define  n 10

#include int main()

, i, j, t;

for(i = 1; i <= n-1; i++)

for(i = 0; i <= n-1; i++)

printf(「%3d」, a[i] );

printf(「\n」);

getch();

return 0;

}

本文出自 「成鵬致遠」 部落格,請務必保留此出處

氣泡排序演算法,選擇排序演算法,插入排序演算法

這是最基本的三種排序演算法,比它效率高的還有歸併排序,堆排序,快速排序等演算法,作為乙個it民工應該好好掌握。氣泡排序,選擇排序和插入排序都有兩層迴圈,時間複雜度均為o n 2 下面逐一介紹 氣泡排序 1.外層迴圈,控制冒泡次數,起始從loop 1開始,結束標識是loop2.內層迴圈,選出對應輪的最...

冒泡 選擇 插入排序演算法

1.氣泡排序 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數 也就是第一波冒泡完成 針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。...

排序演算法 冒泡 選擇 插入排序

本文簡單總結一下三大排序演算法,如有不足,請多多提意見。簡述 從小到大排序,每次比較兩個元素,看他們的順序有沒有錯,如果錯了就換過來。a 比較abc.元素,如果第乙個比第二個大,則將兩個元素交換位置 bac.再依次將a和c進行比較。b 對每一對相鄰的元素做同樣的工作,從第一對到最後一對。這一次執行完...