冒泡排序
时间:2022-04-22
本文章向大家介绍冒泡排序,主要内容包括乱序情况下:、正序情况下、逆序情况下:、全部代码:、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
冒泡排序时间复杂度上为O(n^2)
冒泡排序三种方式,第一种也是最基本的排序:
void bubbleSort1(int *arr,int length){
int i,j,k;
for(i=0;i<length;i++){
for(j=i+1;j<length;j++){
if(arr[i]>arr[j]){
k = arr[j];
arr[j] = arr[i];
arr[i] = k;
}
}
}
}
第二种是循环的时候,j指针从尾部开始,每次可以顺便排序其他的元素
void bubbleSort2(int *arr,int length){
int i,j,k;
for(i=0;i<length;i++){
for(j=length-1;j>=i;j--){
if(arr[j] < arr[j-1]){
k = arr[j-1];
arr[j-1] = arr[j];
arr[j] = k;
}
}
}
}
第三种是加入一个标记为,如果一次遍历发现没有元素冒泡,那么立刻停止
void bubbleSort3(int *arr,int length){
int i,j,k;
bool flag = true;
for(i=0;i<length && flag; i++){
flag = false;
for(j=i+1;j<length;j++){
if(arr[i] > arr[j]){
k = arr[j];
arr[j] = arr[i];
arr[i] = k;
flag = true;
}
}
}
}
测试后发现,除了正序的极端情况下,第三种的冒泡排序快一些,其他情况下的冒泡排序都是原始的最简单的方法快。
乱序情况下:
正序情况下
逆序情况下:
全部代码:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4 void copy(int *arr,int length);
5 void bubbleSort1(int *arr,int length);
6 void bubbleSort2(int *arr,int length);
7 void bubbleSort3(int *arr,int length);
8 void print(int *arr,int length);
9 //int arrtest[10] = {3,4,7,8,0,9,1,2,6,5};
10 //int arrtest[10] = {0,1,2,3,4,5,6,7,8,9};
11 int arrtest[10] = {9,8,7,6,5,4,3,2,1,0};
12 int main(){
13 int i;
14 clock_t start,end;
15 int Array[10];
16 copy(Array,10);
17 print(Array,10);
18 printf("bubble 1:n");
19 start = clock();
20 for(i=0;i<100000;i++){
21 copy(Array,10);
22 //print(Array,10);
23 bubbleSort1(Array,10);
24 }
25 end = clock();
26 print(Array,10);
27 printf("bubble 1 time: %d nn",end-start);
28
29 printf("bubble 2:n");
30 start = clock();
31 for(i=0;i<100000;i++){
32 copy(Array,10);
33 //print(Array,10);
34 bubbleSort2(Array,10);
35 }
36 end = clock();
37 print(Array,10);
38 printf("bubble 2 time: %d nn",end-start);
39
40 printf("bubble 3:n");
41 start = clock();
42 for(i=0;i<100000;i++){
43 copy(Array,10);
44 //print(Array,10);
45 bubbleSort3(Array,10);
46 }
47 end = clock();
48 print(Array,10);
49 printf("bubble 3 time: %d nn",end-start);
50
51 getchar();
52 return 0;
53 }
54 void copy(int *arr,int length){
55 int i;
56 for(i=0;i<length;i++){
57 arr[i] = arrtest[i];
58 }
59 }
60 void bubbleSort1(int *arr,int length){
61 int i,j,k;
62 for(i=0;i<length;i++){
63 for(j=i+1;j<length;j++){
64 if(arr[i]>arr[j]){
65 k = arr[j];
66 arr[j] = arr[i];
67 arr[i] = k;
68 }
69 }
70 }
71 }
72 void bubbleSort2(int *arr,int length){
73 int i,j,k;
74 for(i=0;i<length;i++){
75 for(j=length-1;j>=i;j--){
76 if(arr[j] < arr[j-1]){
77 k = arr[j-1];
78 arr[j-1] = arr[j];
79 arr[j] = k;
80 }
81 }
82 }
83 }
84 void bubbleSort3(int *arr,int length){
85 int i,j,k;
86 bool flag = true;
87 for(i=0;i<length && flag; i++){
88 flag = false;
89 for(j=i+1;j<length;j++){
90 if(arr[i] > arr[j]){
91 k = arr[j];
92 arr[j] = arr[i];
93 arr[i] = k;
94 flag = true;
95 }
96 }
97 }
98 }
99 void print(int *arr,int length){
100 int i;
101 for(i=0;i<length;i++){
102 printf("%d ",arr[i]);
103 }
104 printf("n");
105 }
最终可以看到:
冒泡排序方法1>2>3
而从时间运行角度来说:正序情况下最快,乱序排中,逆序情况下最慢
- 机器学习(三)——k-近邻算法基础
- 利用Windows性能计数器(PerformanceCounter)监控
- zepto 基础知识(1)
- [C#7] 1.Tuples(元组)
- 防止“rm-rf/”误删除的5种方法
- 基于DotNetOpenAuth实现OpenID 服务提供者
- .NET 和Java 对象 XML序列化 库WOX
- jquery mobile 移动web(6)
- IIS6 间歇性的发生500错误的解决方法
- 产品之上的世界观
- 使用Windows 7中的库
- WordPress 开发之让浏览器自动加载最新的CSS、JS文件(免刷新缓存)
- [C#6] 0-概览
- 移植Windows自宿主WCF服务到Linux/Mono2.8
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 太慢不能忍!CPU又拿硬盘和网卡开刀了!
- 懂了!VMware/KVM/Docker原来是这么回事儿
- CPU明明8个核,网卡为啥拼命折腾一号核?
- 2020-07-22-腾讯云-slb-kubeadm高可用集群搭建
- 2020-07-23-kubernetes集群使用腾讯云cbs块存储
- 十一、详解面向对象
- 十二、面向对象实战之封装拖拽对象
- 数组reduce方法的高级用法
- 十七、详解 ES6 Modules
- 超干货!为了让你彻底弄懂 MySQL 事务日志,我通宵肝出了这份图解!
- 什么情况下不能使用最坏情况评估算法的复杂度?
- Python运算符
- kubeadm高可用集群意外删除一mater节点,重新加入失败
- Chevereto——简介及安装
- Typecho开启伪静态并隐藏index.php