相信大家在学习数据结构算法的时候经常会遇到的问题就是,老师讲解完这个算法思想,自己也听懂了,但一到自己写代码就写不出来,或者是即便自己模模糊糊的照着网上的代码自己写出来了,但是过几天就又忘了,其实这就是我们没有深刻的理解的这个算法的思想。
接下来,我就结合图例给大家详细的讲解一下。
冒泡排序的名字是因为元素排序的过程像水中的气泡一样一个一个的浮出水面,元素也一个一个从大到小(从小到大)的排序完成。
1、两两相邻的元素进行比较,如果前面元素大于后面元素就交换两个元素的位置,最终的结果是最大的一个元素移动到了最后的位置。 我们暂称这个过程为冒泡。
2、如果有n个元素那么【冒泡操作】重复n-1次即可排序完成。
我们来看一个动图来体会一下冒泡排序算法。
我们有一个待排序序列是:【3,44,38,5,47,15,36】
如果要将这7个元素进行排序那么需要进行6趟冒泡才能完成排序。
①第一个元素和第二个元素进行比较,第一个小于第二个位置不变。
O(n2)
空间复杂度由于需要开辟一个临时空间所以是:O(1)
#include<stdio.h>
void Print(int array[],int len){
for(int i=0;i<len;i++){
printf("%d ",array[i]);
}
}
void BubbleSort(int array[],int len){
int tem;
//外层循环控制 排序的趟数 n个元素排序需要循环n-1次 【1】
for(int i=0;i<len-1;i++) {
//内层循环控制比较的次数 n个元素第i趟比较n-i次 【2】
for(int j=0;j<len-1-i;j++) {
//比较相邻的元素大小 目的:将最大的元素选出到移动到最后
if(array[j]>array[j+1]){
tem = array[j];
array[j] = array[j+1];
array[j+1] = tem;
}
}
}
printf("\n\n排序完成!\n");
}
int main(){
int array[] = {3,44,38,5,47,15,36};
int len = sizeof(array) / sizeof(int);
printf("原始序列为:\n");
Print(array,len);
BubbleSort(array,len);
printf("\n排序后序列为:\n");
Print(array,len);
}
当我在学习完这个冒泡排序算法的时候尝试自己写代码,但是有两个地方我觉得容易出现问题所有在这里说明一下:
【1】第一个for循环是控制进行几次冒泡的,所以循环的次数的是待排序序列元素个数减一次。
【2】第二个for循环是控制每一趟冒泡两两元素间进行比较的,j从0到n-1,j+1从1到n这个地方我第一次 忽略-1,即j从0到n,那么j+1就会超过了排序序列的最大长度。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- hids.cn 版权所有 赣ICP备2024042780号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务