冒泡排序算法整理
面试的时候问到二分查找的时候居然忘记最重要的步骤,先进行排序了,面试官也提醒了怎么还是没反应过来呢,所以还是好好理一下一些常用的排序算法,努力总是会有收获的,加油!
冒泡排序算法,以升序为例,假设一个数组中,我们比较相邻的元素,如果第一个比第二个大,我们就交换他们两个,通过第一次的冒泡就可以找到所有元素中最大的那一个并实现将它排在数组的最后的位置,之后再进行第二次冒泡,也是同样比对两个相邻的元素的大小,进而可以找到第二大的元素并将它排在数组后面,以此重复,直到没有数字需要比较。
举个例子:
数组
34 12 67 22 11 3 21 56
数组共8个元素,所以我们需要进行8-1=7次的冒泡,每次冒泡需要进行比对的次数随着冒泡次数的增加也相应减少,比如第1次冒泡,我们需要进行7次比对,但是第2次冒泡我们只需要进行6次比对,因为这个时候数组中最大的元素已经找到了。
我们进行第一次冒泡:
(1)34和12比对
12 34 67 22 11 3 21 56
(2)34和67比对
12 34 67 22 11 3 21 56
(3)67和22比对
12 34 22 67 11 3 21 56
(4)67和11比对
12 34 22 11 67 3 21 56
(5)67和3比对
12 34 22 11 3 67 21 56
(6)67和21比对
12 34 22 11 3 21 67 56
(7)67和56比对
12 34 22 11 3 21 56 67
可以得到数组的最大值存放在数组的最后位置;之后依次重复即可得到排好序的数组。
C语言实现如下:
#include <stdio.h>
void bubble_sort(int a[],int n){
int temp;//swap
for(int i=0;i<n-1;i++){ //多少次起泡
for(int j=0;j<n-1-i;j++){ //该次起泡中需要进行多少次比较
if(a[j]>a[j+1]){
temp =a[j+1];
a[j+1] = a[j];
a[j] = temp;
}
}
}
}
int main(){
int n;
int number[1000];
printf("please input the number of the array:");
scanf("%d",&n);
printf("please input the array\n");
for(int t=0;t<n;t++){
scanf("%d",&number[t]);
}
bubble_sort(number,n);
printf("the bubble_sort result is: ");
for(int k=0;k<n;k++){
printf("%d ",number[k]);
}
return 0;
}