经典排序算法----冒泡排序算法及其优化
2016-04-21 12:15
477 查看
概念:
设数组长度为N。比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。
这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。
N=N-1,如果N不为0就重复前面二步,否则排序完成。
算法实现
按照定义:#include<stdio.h> #include<stdlib.h> void Show(int *arr, int n) { printf("数组排序:"); for (int i = 0; i < n; i++) printf("%-3d", arr[i]); printf("\n"); } void Swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } <span style="color:#ff0000;"><strong>void BubbleSort(int *arr, int n) { for (int i = 0; i < n; i++) for (int j = 1; j < n - i; j++) if (arr[j - 1] > arr[j]) Swap(&arr[j - 1], &arr[j]); }</strong></span> void main() { int arr[10] = { 9, 8, 7, 6, 4, 5, 3, 1, 2, 0 }; Show(arr, 10); BubbleSort(arr, 10); Show(arr, 10); system("pause"); }运行结果:
数组排序:9 8 7 6 4 5 3 1 2 0 数组排序:0 1 2 3 4 5 6 7 8 9 请按任意键继续. . .
优化一:
下面对其进行优化,设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。算法实现:
#include<stdio.h> #include<stdlib.h> void Show(int *arr, int n) { printf("数组排序:"); for (int i = 0; i < n; i++) printf("%-3d", arr[i]); printf("\n"); } void Swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } <span style="color:#ff0000;"><strong>void BubbleSort2(int *arr, int n) { int j, k; int flag; k = n; flag = 1; while (flag) { flag = 0; for (j = 1; j < k; j++) if (arr[j - 1] > arr[j]) { Swap(&arr[j - 1], &arr[j]); flag = 1; } k--; } }</strong></span> void main() { int arr[10] = { 9, 8, 7, 6, 4, 5, 3, 1, 2, 0 }; Show(arr, 10); BubbleSort2(arr, 10); Show(arr, 10); system("pause"); }运行结果:
数组排序:9 8 7 6 4 5 3 1 2 0 数组排序:0 1 2 3 4 5 6 7 8 9 请按任意键继续. . .
优化二:
再做进一步的优化。如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。#include<stdio.h> #include<stdlib.h> void Show(int *arr, int n) { printf("数组排序:"); for (int i = 0; i < n; i++) printf("%-3d", arr[i]); printf("\n"); } void Swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } <span style="color:#ff0000;"><strong>void BubbleSort3(int *arr, int n) { int j, k; int flag; flag = n; while (flag > 0) { k = flag; flag = 0; for (j = 1; j < k; j++) if (arr[j - 1] > arr[j]) { Swap(&arr[j - 1], &arr[j]); flag = j; } } }</strong></span> void main() { int arr[10] = { 9, 8, 7, 6, 4, 5, 3, 1, 2, 0 }; Show(arr, 10); BubbleSort3(arr, 10); Show(arr, 10); system("pause"); }
运行结果:
数组排序:9 8 7 6 4 5 3 1 2 0 数组排序:0 1 2 3 4 5 6 7 8 9 请按任意键继续. . .
引自</article/1389273.html>
相关文章推荐
- windows下zlib库的编译与使用
- SQLAlchemy
- AndroidStudio获取(debug/release)签名的sha1值
- 自定义SeekBarPreference
- LeetCode *** 209. Minimum Size Subarray Sum
- 除去字符串里相同的字符
- 长文干货!走近人脸检测:从VJ到深度学习(上)(下)
- wincache xcache 性能测试
- 广义表
- 常用按钮样式
- uva12661
- 万恶的开源druid,去die
- Irrlicht学习笔记(1)--helloworld
- msp430的printf函数的简单移植
- IEEE极限编程之The pipeline-动态规划思想
- 安卓错误总结
- Lua应用——tables应用,查找是否为保留字
- CSS3设置checkbox的样式
- ios Undefined symbols for architecture x86_64: "XXX", "_OBJC_CLASS_$_", referenced fr
- OSI 七层协议参考模型 与 TCP/IP协议 实现网络模型