C語言 冒泡法排序,選擇法排序和插入排序

2021-06-27 11:04:45 字數 4200 閱讀 6705

例項1 冒泡法排序

陣列中有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;

}

JAVA中冒泡法排序和選擇法排序

首先,我們先說下冒泡法 以公升序為例,既 1,2,3,4,5這個順序 其原理就是相鄰兩個數相比,如 a i 與a i 1 比較,如果前面的比後面大,則這兩個數交換,把大的數交換給a i 1 小的數交換給a i 下次比較就是a i 1 與 a i 2 繼續上一次的操作,如果後面的大於前面的,則兩個數交...

陣列實現冒泡法和選擇法排序(C )

include include using namespace std void bubble sort int arry,int num void getarry int arry,int num void outarry int arry,int num void select sort int...

冒泡法 選擇法 插入法排序

includevoid inputarray int a,int n 輸入陣列元素 void outputarray int a,int n 輸出陣列元素 void sort01 int a,int n 冒泡法排序 void sort02 int a,int n 選擇法排序 void sort03 ...