冒泡排序的原理是:從左到右橘霎,相鄰元素進(jìn)行比較虑凛。每次比較一輪碑宴,就會找到序列中最大的一個或最小的一個。這個數(shù)就會從序列的最右邊冒出來桑谍。
冒泡排序:
有兩種延柠,
一種是小泡向上冒,
一種是大泡向下沉霉囚。
首先捕仔,設(shè)待排序長為n匕积,
從后往前(從前向后)兩兩比較相鄰元素的值盈罐,若為逆序, (a[i-1]>a[i])闪唆,則交換他們盅粪,直到序列比較結(jié)束。
-
例子(大泡下沉悄蕾,即從前向后比較)
交換過程中票顾,會將較大的元素一直向后移動础浮,故,會將最大的元素移動到最終的位置上
image.png
這樣就稱為一次冒泡過程
需要多少次冒泡過程奠骄?:
一共需要n-1次冒泡豆同,就可以將序列變成遞增的序列
為啥是n-1呢
因為排到最后,只剩兩個數(shù)了含鳞,我們只需要比較一次影锈,即可得到這兩個數(shù)的有序序列。
需要比較多少次?:
一共比較了(等差數(shù)列求和公式)次:n*(n-1)/2.
#include<stdio.h>
void bubbleSort(int *arr,int n)
{
int m,i,j;
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
if(arr[j]>arr[j+1])
{
m=arr[j];
arr[j]=arr[j+1];
arr[j+1]=m;
}
}
int main(){
int arr[]={9,7,5,4,3,2};
bubbleSort(arr,6);
int i;
for(i=0;i<6;i++){
printf("%d\n",arr[i]);
}
return 0;
}
image.png
代碼分析:
for(i=0;i<n-1;i++){
for(j=0;j<n-1-i;j++){
}
}
首先i<n-1保證了循環(huán)執(zhí)行0~n-2次,
循環(huán)結(jié)束條件是i>=n-1,當(dāng)i=n-1時中跌,就結(jié)束了维雇,所以一共執(zhí)行了i從0到n-2,合計為n-1次冒泡晒他。
然后就是
當(dāng)i=0的時候吱型,需要比較n-1次,就想到了n-1
就是j<n-1很正常陨仅,然后為什么要-i呢津滞?
因為根據(jù)上述分析知道,每冒泡一次灼伤,就有一個數(shù)歸位触徐,
每次冒泡排序的次數(shù)就減少1,所以i每+1狐赡,j就要-1撞鹉。
i控制冒泡次數(shù),
j控制每次冒泡需要的排序次數(shù)颖侄。
*arr運用指針鸟雏,使得傳過來的值都是實參和形參都一致???那個怎么說來著。
-
從后向前比較的代碼:
通過設(shè)計flag來減少冒泡的次數(shù)览祖。