當前位置:首頁 » 編程語言 » c語言冒泡排序實例
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言冒泡排序實例

發布時間: 2022-05-16 12:11:02

c語言一維數組冒泡排序

如果遇到相等的值不進行交換,那這種排序方式是穩定的排序方式。 原理:比較兩個相鄰的元素,將值大的元素交換到右邊 思路:依次比較相鄰的兩個數,將比較小的數放在前面,比較大的數放在後面。 (1)第一次比較:首先比較第一和第二個數,將小數放在前面,將大數放在後面。 (2)比較第2和第3個數,將小數 放在前面,大數放在後面。 ...... (3)如此繼續,知道比較到最後的兩個數,將小數放在前面,大數放在後面,重復步驟,直至全部排序完成 (4)在上面一趟比較完成後,最後一個數一定是數組中最大的一個數,所以在比較第二趟的時候,最後一個數是不參加比較的。 (5)在第二趟比較完成後,倒數第二個數也一定是數組中倒數第二大數,所以在第三趟的比較中,最後兩個數是不參與比較的。 (6)依次類推,每一趟比較次數減少依次比上一趟減少一次。 演算法分析: (1)由此可見:N個數字要排序完成,總共進行N-1趟排序,每i趟的排序次數為(N-i)次,所以可以用雙重循環語句,外層控制循環多少趟,內層控制每一趟的循環次數 (2)冒泡排序的優點:每進行一趟排序,就會少比較一次,因為每進行一趟排序都會找出一個較大值。如上例:第一趟比較之後,排在最後的一個數一定是最大的一個數,第二趟排序的時候,只需要比較除了最後一個數以外的其他的數,同樣也能找出一個最大的數排在參與第二趟比較的數後面,第三趟比較的時候,只需要比較除了最後兩個數以外的其他的數,以此類推……也就是說,沒進行一趟比較,每一趟少比較一次,一定程度上減少了演算法的量。 (3)時間復雜度 1.如果我們的數據正序,只需要走一趟即可完成排序。所需的比較次數C和記錄移動次數M均達到最小值,即:Cmin=n-1;Mmin=0;所以,冒泡排序最好的時間復雜度為O(n)。 2.如果很不幸我們的數據是反序的,則需要進行n-1趟排序。每趟排序要進行n-i次比較(1≤i≤n-1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種情況下,比較和移動次數均達到最大值: 綜上所述:冒泡排序總的平均時間復雜度為:O(n2) ,時間復雜度和數據狀況無關。 void BubbleSort(int a[], int len) { int i, j, temp; for (j = 0; j < len - 1; j++) { for (i = 0; i < len - 1 - j; i++) if (a[i] > a[i + 1]) { temp = a[i]; a[i] = a[i + 1]; a[i + 1] = temp; } } }

Ⅱ C語言冒泡排序。

#include<stdio.h>

void main()

{

int a[10];

int i,j,t;

printf("input 10 numbers: ");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

for(j=0;j<9;j++) /*進行9次循環 實現9趟比較*/

for(i=0;i<9-j;i++) /*在每一趟中進行9-j次比較*/

if(a[i]>a[i+1]) /*相鄰兩個數比較,想降序只要改成a[i]<a[i+1]*/

{

t=a[i];

a[i]=a[i+1];

a[i+1]=t;

}

printf("the sorted numbers: ");

for(i=0;i<10;i++)

printf(" %d",a[i]);


}

(2)c語言冒泡排序實例擴展閱讀:

冒泡排序演算法的運作

1、比較相鄰的元素。如果第一個比第二個大(小),就交換他們兩個。

2、對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大(小)的數。

3、針對所有的元素重復以上的步驟,除了最後已經選出的元素(有序)。

4、持續每次對越來越少的元素(無序元素)重復上面的步驟,直到沒有任何一對數字需要比較,則序列最終有序。

簡單的表示

#include <stdio.h>

void swap(int *i, int *j)

{

int temp = *i;

*i = *j;

*j = temp;

}

int main()

{

int a[10] = {2,1,4,5,6,9,7,8,7,7};

int i,j;

for (i = 0; i < 10; i++)

{

for (j = 9; j > i; j--)//從後往前冒泡

{

if (a[j] < a[j-1])

{

swap(&a[j], &a[j-1]);

}

}

}

for (i = 0; i < 10; i++)

{

printf("%d ", a[i]);

}

return 0;

}

參考資料來源:冒泡排序-網路

Ⅲ c語言冒泡排序詳解

冒泡排序是最簡單的排序方法,理解起來容易。雖然它的計算步驟比較多,不是最快的,但它是最基本的,初學者一定要掌握。

冒泡排序的原理是:從左到右,相鄰元素進行比較。每次比較一輪,就會找到序列中最大的一個或最小的一個。這個數就會從序列的最右邊冒出來。

以從小到大排序為例,第一輪比較後,所有數中最大的那個數就會浮到最右邊;第二輪比較後,所有數中第二大的那個數就會浮到倒數第二個位置……就這樣一輪一輪地比較,最後實現從小到大排序。

比如對下面這個序列進行從小到大排序:
90 21 132 -58 34

第一輪:
1) 90 和 21比,90>21,則它們互換位置:
21 90 132 -58 34

2) 90 和 132 比,90<132,則不用交換位置。
3)132 和 –58 比,132>–58,則它們互換位置:
21 90 -58 132 34

4)132 和 34 比,132>34,則它們互換位置:
21 90 -58 34 132

到此第一輪就比較完了。第一輪的結果是找到了序列中最大的那個數,並浮到了最右邊。

比較時,每輪中第 n 次比較是新序列中第 n 個元素和第 n+1 個元素的比較(假如 n 從 1 開始)。

第二輪:
1) 21 和 90 比,21<90,則不用交換位置。
2) 90 和 –58 比,90>–58,則它們互換位置:
21 -58 90 34 132

3) 90 和 34 比,90>34,則它們互換位置:
21 -58 34 90 132

到此第二輪就比較完了。第二輪的結果是找到了序列中第二大的那個數,並浮到了最右邊第二個位置。

第三輪:
1) 21 和 –58 比,21>–58,則它們互換位置:
-58 21 34 90 132

2) 21 和 34 比,21<34,則不用交換位置。

到此第三輪就比較完了。第三輪的結果是找到了序列中第三大的那個數,並浮到了最右邊第三個位置。

第四輪:
1) –58 和 21 比,–58<21,則不用交換位置。

至此,整個序列排序完畢。從小到大的序列就是「–58 21 34 90 132」。從這個例子中還可以總結出,如果有 n 個數據,那麼只需要比較 n–1 輪。而且除了第一輪之外,每輪都不用全部比較。因為經過前面輪次的比較,已經比較過的輪次已經找到該輪次中最大的數並浮到右邊了,所以右邊的數不用比較也

Ⅳ C語言冒泡排序法是什麼

冒泡排序法,是C語言常用的排序演算法之一,意思是對一組數字進行從大到小或者從小到大排序的一種演算法。

具體方法是:

相鄰數值兩兩交換。從第一個數值開始,如果相鄰兩個數的排列順序與我們的期望不同,則將兩個數的位置進行交換(對調);如果其與我們的期望一致,則不用交換。重復這樣的過程,一直到最後沒有數值需要交換,則排序完成。

C語言常見的排序演算法:

1、冒泡排序

基本思想:比較相鄰的兩個數,如果前者比後者大,則進行交換。每一輪排序結束,選出一個未排序中最大的數放到數組後面。

2、快速排序

基本思想:選取一個基準元素,通常為數組最後一個元素(或者第一個元素)。從前向後遍歷數組,當遇到小於基準元素的元素時,把它和左邊第一個大於基準元素的元素進行交換。在利用分治策略從已經分好的兩組中分別進行以上步驟,直到排序完成。

3、直接插入排序

基本思想:和交換排序不同的是它不用進行交換操作,而是用一個臨時變數存儲當前值。當前面的元素比後面大時,先把後面的元素存入臨時變數,前面元素的值放到後面元素位置,再到最後把其值插入到合適的數組位置。

4、直接選擇排序

基本思想:依次選出數組最小的數放到數組的前面。首先從數組的第二個元素開始往後遍歷,找出最小的數放到第一個位置。再從剩下數組中找出最小的數放到第二個位置。以此類推,直到數組有序。

以上內容參考 網路-排序演算法、網路-c語言冒泡排序


Ⅳ C語言簡單冒泡法程序

#include<stdio.h>

voidsort(int*a,intlen)

{inti=0;

intj;

intt;

for(i=0;i<len;i++)

{

for(j=0;j<len-i-1;j++)

{

if(a[j]>a[j+1])

{

t=a[j];

a[j]=a[j+1];

a[j+1]=t;

}

}

}

}

intmain(intargc,char*argv[])

{

inta[10]={

-999,2,3,77,12,88,0,-8,99,100

};

inti=0;

sort(a,10);

for(i=0;i<10;i++)

{

printf("%d",a[i]);

}

return0;

}

(5)c語言冒泡排序實例擴展閱讀

冒泡排序法

#include"stdio.h"

voidmain()

{

inta[10];

inti,j,temp;

//輸入10個整型數據

printf("Pleaseinputtennumbers: ");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

//排序

for(i=0;i<9;i++)//10個數,10-1輪冒泡,每一輪都將當前最大的數推到最後

{

for(j=0;j<9-i;j++)//9-i,意思是每當經過一輪冒泡後,就減少一次比較

if(a[j]>a[j+1])

{

temp=a[j];

a[j]=a[j+1];

a[j+1]=temp;

}

}

//列印排序結果

for(i=0;i<10;i++)

printf("%d ",a[i]);

return0;

}

Ⅵ C語言:編寫一個程序用冒泡排序實現升序排列

程序如下:

#include <stdio.h>

int main ()

{

int a[10];

int i, j, t;

printf ("請輸入十個數: ");

for (i = 0; i < 10; i++)

{

printf ("a[%d]=", i+1);

scanf ("%d",&a[i]);

}

for (j = 0;j < 9; j++)

for (i = 0; i < 9 - j; i++)

if (a[i] > a[i+1])

{

t = a[i];

a[i] = a[i+1];

a[i+1] = t;

}

printf ("由小到大的順序為: ");

for (i = 0; i < 10; i++)

{

printf ("%d,",a[i]);

}

printf (" ");

return 0;

}

運行結果

請輸入十個數:

a[1]=7

a[2]=8

a[3]=9

a[4]=6

a[5]=5

a[6]=4

a[7]=1

a[8]=2

a[9]=3

a[10]=99

由小到大的順序為:

1,2,3,4,5,6,7,8,9,99。

冒泡排序演算法的原理如下:

1、比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

2、對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。

3、針對所有的元素重復以上的步驟,除了最後一個。

4、持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。

(6)c語言冒泡排序實例擴展閱讀:

冒泡排序的思想:

首先,從表頭開始往後掃描數組,在掃描過程中逐對比較相領兩個元素的大小。若相鄰兩個元素中,前面的元素大於後面的元素,則將它們互換,稱之為清去了一個逆序。

在掃描過程中,不斷地將兩相鄰元素中的大者往後移動,最後就將數組中的最大者換到了表的最後,這正是數組中最大元素應有的位置。

然後,在剩下的數組元素中(n-1個元素)重復上面的過程,將次小元素放到倒數第2個位置。不斷重復上述過程,直到剩下的數組元素為0為止,此時的數組就變為了有序。

假設數組元素的個數為西,在最壞情況下需要的比較總次數為:(n-1)+(n-2)...+2+1)-n(n-1)/2。

Ⅶ c語言編程:對10個數冒泡排序(升序)。

#include<stdio.h>

intmain(){

intnumber[10]={95,45,15,78,84,51,24,12,34,23};

for(int j=0;j< 9;j++)

for(int i=0;i< 9 -j;i++) {

if(a[i]>a[i+1]) {

int temp=a[i];

a[i]=a[i+1];

a[i+1]=temp; }

}

for(int i=0;i< 10;i++){

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

}

插入排序

已知一組升序排列數據a[1]、a[2]、……a[n],一組無序數據b[1]、b[2]、……b[m],需將二者合並成一個升序數列。

首先比較b[1]與a[1]的值,若b[1]大於a[1],則跳過,比較b[1]與a[2]的值,若b[1]仍然大於a[2],則繼續跳過,直到b[1]小於a數組中某一數據a[x],則將a[x]~a[n]分別向後移動一位,將b[1]插入到原來a[x]的位置這就完成了b[1]的插入。

b[2]~b[m]用相同方法插入。

快速排序

快速排序是大家已知的常用排序演算法中最快的排序方法。已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。首先任取數據a[x]作為基準。

比較a[x]與其它數據並排序,使a[x]排在數據的第k位,並且使a[1]~a[k-1]中的每一個數據<a[x],a[k+1]~a[n]中的每一個數據>a[x],然後採用分治的策略分別對a[1]~a[k-1]和a[k+1]~a[n]兩組數據進行快速排序。

希爾排序

已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。

首先取一增量d(d<n),將a[1]、a[1+d]、a[1+2d]……列為第一組,a[2]、a[2+d]、a[2+2d]……列為第二組……,a[d]、a[2d]、a[3d]……列為最後一組以次類推,在各組內用插入排序,然後取d'<d,重復上述操作,直到d=1。

Ⅷ c語言冒泡排序法詳解

任意兩個數作比較,大的放後面,小的放前面,然後大的在和下一個數比較,還是大的放後小的往前,以此類推,直到所有數比完了,然後輸出

Ⅸ c語言冒泡排序法

(1)基本思想:在要排序的一組數中,對當前還未排好序的范圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。

(2)實例:

(3)代碼解釋:

#include<stdio.h>
int main()
{
int a[10];
int i,j,t,temp;//temp記錄臨時中間值
printf("請輸入10個數:");
for (i=0;i<10;i++)
{
scanf("%d",&a[i]);//記錄輸入的十個數
}
for (j=1;j<=9;j++)
{
t=10-j;
for (i=0;i<t;i++)
{
if (a[i]>a[i+1]) {

//交換兩數的位置

temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}

}
for (i=0;i<=9;i++)
{
printf("%d ",a[i]);
}
return 0;
}


望採納!

Ⅹ C語言 冒泡排序法的代碼

#include<stdio.h>

void main()

{

int a[10];

int i,j,t;

printf("input 10 numbers: ");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

for(j=0;j<9;j++) /*進行9次循環 實現9趟比較*/

for(i=0;i<9-j;i++) /*在每一趟中進行9-j次比較*/

if(a[i]>a[i+1]) /*相鄰兩個數比較,想降序只要改成a[i]<a[i+1]*/

{

t=a[i];

a[i]=a[i+1];

a[i+1]=t;

}

printf("the sorted numbers: ");

for(i=0;i<10;i++)

printf(" %d",a[i]);


}

(10)c語言冒泡排序實例擴展閱讀:

冒泡排序演算法的運作

1、比較相鄰的元素。如果第一個比第二個大(小),就交換他們兩個。

2、對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大(小)的數。

3、針對所有的元素重復以上的步驟,除了最後已經選出的元素(有序)。

4、持續每次對越來越少的元素(無序元素)重復上面的步驟,直到沒有任何一對數字需要比較,則序列最終有序。

簡單的表示

#include <stdio.h>

void swap(int *i, int *j)

{

int temp = *i;

*i = *j;

*j = temp;

}

int main()

{

int a[10] = {2,1,4,5,6,9,7,8,7,7};

int i,j;

for (i = 0; i < 10; i++)

{

for (j = 9; j > i; j--)//從後往前冒泡

{

if (a[j] < a[j-1])

{

swap(&a[j], &a[j-1]);

}

}

}

for (i = 0; i < 10; i++)

{

printf("%d ", a[i]);

}

return 0;

}

參考資料來源:冒泡排序-網路