【算法】冒泡排序(从小到大) 排序范围(0~n-1)n为数组元素个数
来源:互联网 发布:出国gpa算法 知乎 编辑:程序博客网 时间:2024/05/21 19:48
今天要谈的是基本排序算法中的冒泡排序。除了冒泡排序,基本排序算法还包括:选择排序、插入排序。
插入排序算法的思想也是很简单的,它把排序过程模拟成了从水底冒气泡的过程。一趟排序过程结束后,最小(最轻)的元素就已经“浮”到水面上了。接下来就是不断缩小排序范围,把每个排序范围中最小的元素交换到数组头。
接下来就来分析算法,我们使用的数据是1 3 2 8 0 6 共6个元素
我们总的排序范围为0~5,即0~n-1,我们令一个指针j指向数组的最后一个元素,至于j有啥“特异功能”,慢慢往后看~
1、第一趟,排序范围(0,5),目标是将其中的最小值0,交换至数组头。将a[j]与a[j-1]的值相比较,如果a[j-1] > a[j]则将a[j]的值与a[j-1]的值进行交换,要把小的值往前推嘛~
显然j指针就是为了在不断比较当中寻找待排序数组中的最小值,并把它存于数组头。
2、第二趟,排序范围(1,5),目标是将其中的最小值1,交换至数组头。
3、第三趟,排序范围(2,5),目标是将其中的最小值2,交换之数组头。
4、第四趟,排序范围(3,5),目标是将其中的最小值3,交换至数组头
5、第五趟,排序范围(4,5),目标是将其中的最小值6,交换至数组头
至此,排序结束,最终序列为
我们通过观察,发现我们总共6个元素,排序进行了5趟;每趟排序开始前,j指针总指向末尾;交换数据的条件为a[j-1] >a[j];a[j]总指向当前遍历过的最小的值
不想太多,直接根据我们的结论写代码。我们可以分成两个部分实现:
void pop(Elemtype a[] , int begin , int end){int j;for(j = end ; j > begin ; j--){//将最小值往前推if(a[j-1] > a[j]){swap(&a[j-1],&a[j]);}}}void sort(Elemtype a[] , int begin , int end){int i;//执行n-1次for(i = begin ; i < end ; i++){pop(a,i,end);}}void swap(Elemtype *a , Elemtype *b){Elemtype t = *a;*a = *b;*b = t;}
完整程序如下:
#include <stdio.h>#define Elemtype intvoid swap(Elemtype *a , Elemtype *b);void pop(Elemtype a[] , int begin , int end){int j;for(j = end ; j > begin ; j--){//将最小值往前推if(a[j-1] > a[j]){swap(&a[j-1],&a[j]);}}}void sort(Elemtype a[] , int begin , int end){int i;//执行n-1次for(i = begin ; i < end ; i++){pop(a,i,end);}}void swap(Elemtype *a , Elemtype *b){Elemtype t = *a;*a = *b;*b = t;}void display(Elemtype a[] , int begin , int end){int i;for(i = begin ; i <= end ; i++){printf("%d ",a[i]);}printf("\n");}int main(){Elemtype a[] = {1,3,2,8,0,6};sort(a,0,5);display(a,0,5);return 0;}
程序运行效果如下:
冒泡排序的时间复杂度为O(n^2)
PS.不要胡思乱想不要胡思乱想,跟着分析走就好,不然会绕进死胡同。。。
- 【算法】冒泡排序(从小到大) 排序范围(0~n-1)n为数组元素个数
- 【算法】选择排序(从小到大) 排序范围(0~n-1) n为数组元素个数
- 【算法】插入排序(从小到大) 排序范围(0~n-1)n为数组元素个数
- 【算法】快速排序算法(递归实现 从小到大排列) 排序范围(0~n-1) n为数组元素个数
- n个数从小到大排序(n<5)
- Java编写 函数数组(键盘输入n个数) 冒泡排序
- Java编写 函数数组(键盘输入n个数) 冒泡排序
- 从小到大排序--冒泡算法
- 运用冒泡排序法-从小到大排列数组中的元素
- 排序0-n^k-1范围内的n个数,要求时间复杂度为线性
- 1~n无序数组时间复杂度为O(n)排序
- 1~n无序数组时间复杂度为O(n)排序
- 编写程序对N个元素数组,用冒泡排序法进行排序
- 找出数组从小到大的前N个数
- O(n^2)排序算法1——冒泡排序,改进冒泡排序,java实现
- 关于几个复杂度为N^N的排序算法-冒泡,插入,选择(C++实现)
- 用Java实现单链表---输入n个数,用单链表(任意算法)对其进行排序并按从小到大顺序输出。
- 算法导论8.3-4 O(n)时间内对[0..n^-1]之间的n个数排序
- element-ui 表格实现单元格可编辑的方法
- 如何创建一个对象
- Fundebug能够捕获这些BUG
- 单片机时钟程序(9)lcd1602.h
- SuperTextView
- 【算法】冒泡排序(从小到大) 排序范围(0~n-1)n为数组元素个数
- UnboundLocalError: local variable 'sum1' referenced before assignment
- linux 安装mysql
- (9)计算人民币各个面额的数量
- SDWebImage 和MWPhotoBrower联合使用的时候加载进度的expectSize一直为0或-1
- 大数据性能调优之HBase的RowKey设计
- 基于深度学习的目标检测的研究进展2
- C语言的输入与输出
- 分类模型的评估方法-F分数(F-Score)