冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。
冒泡排序:
有两种,
一种是小泡向上冒,
一种是大泡向下沉。
首先,设待排序长为n,
从后往前(从前向后)两两比较相邻元素的值,若为逆序, (a[i-1]>a[i]),则交换他们,直到序列比较结束。
-
例子(大泡下沉,即从前向后比较)
交换过程中,会将较大的元素一直向后移动,故,会将最大的元素移动到最终的位置上
image.png这样就称为一次冒泡过程
需要多少次冒泡过程?:
一共需要n-1次冒泡,就可以将序列变成递增的序列
为啥是n-1呢
因为排到最后,只剩两个数了,我们只需要比较一次,即可得到这两个数的有序序列。
需要比较多少次?:
一共比较了(等差数列求和公式)次: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保证了循环执行0~n-2次,
循环结束条件是i>=n-1,当i=n-1时,就结束了,所以一共执行了i从0到n-2,合计为n-1次冒泡。
然后就是
当i=0的时候,需要比较n-1次,就想到了n-1
就是j<n-1很正常,然后为什么要-i呢?
因为根据上述分析知道,每冒泡一次,就有一个数归位,
每次冒泡排序的次数就减少1,所以i每+1,j就要-1。
i控制冒泡次数,
j控制每次冒泡需要的排序次数。
*arr运用指针,使得传过来的值都是实参和形参都一致???那个怎么说来着。
-
从后向前比较的代码:
通过设计flag来减少冒泡的次数。
网友评论