排序(二)——冒泡排序及其改进
2016-07-30 09:45
281 查看
冒泡排序(Bubble
Sort)
冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
冒泡排序算法的步骤:
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
#include<stdio.h> void BubbleSort(int arr[], int size) { int i = size; int j = 0; int temp = 0; while (i) { for (j = 0; j < i - 1; ++j) { if (arr[j]>arr[j + 1]) { temp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = temp; } } i--; } } int main(int arc, char* const argv[]) { int arr[] = { 1, 3, 5, 7, 8, 4, 9, 12, 3, 0 }; BubbleSort(arr, 10); for (int i = 0; i < 10; ++i) { printf("%4d", arr[i]); } system("pause"); return 0; }
冒泡排序算法最坏情况和平均复杂度是O(n²),甚至连插入排序(O(n²)算法复杂度)效率都比冒泡排序算法更好,唯一的优势在于基于它的改进算法——快速排序算法。
冒泡排序算法改进
记住最后一次交换发生位置index的冒泡排序
1.设置一标志性变量index, 用于记录每趟排序中最后一次进行交换的位置。由于index位置之后的记录均已交换到位,
故在进行下一趟排序时只要扫描到pos位置即可。
#include<stdio.h> void BubbleSort(int arr[], int size) { int i = size; int j = 0; int temp = 0; int index = 0; while (i) { for (j = 0; j < i - 1; ++j) { if (arr[j]>arr[j + 1]) { temp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = temp; } } i--; } } int main(int arc, char* const argv[]) { int arr[] = { 1, 3, 5, 7, 8, 4, 9, 12, 3, 0 }; BubbleSort(arr, 10); for (int i = 0; i < 10; ++i) { printf("%4d", arr[i]); } system("pause"); return 0; }
2.如果某一趟没有数据交换,则表示已经排好序,就可以提前终止循环。
(ps:因为C中不支持bool类型,所以下面代码改成了C++类型,当然如果想在C语言中判断真假话,可以自己定义下:
typedef
char bool;
#define TRUE 1
#define FALSE 0 )。
#include<stdio.h> #include<iostream> using namespace std; void BubbleSort(int arr[], int size) { int i = size; int j = 0; int temp = 0; int index = 0; bool isEXchange = true; while (i) { for (j = 0; j < i - 1; ++j) { if (arr[j]>arr[j + 1]) { temp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = temp; index = j; isEXchange == true; } } i--; } } int main(int arc, char* const argv[]) { int arr[] = { 1, 3, 5, 7, 8, 4, 9, 12, 3, 0 }; BubbleSort(arr, 10); for (int i = 0; i < 10; ++i) { printf("%4d", arr[i]); } system("pause"); return 0;
相关文章推荐
- ExpandableListView的使用及注册上下文菜单
- 解救人质 BFS模板(迷宫问题)
- Sequence Modeling:Recurrent and Recursive Nets
- 62.画图
- C++模板的特化与偏特化
- Codeforces Round #363 (Div. 2) A. Launch of Collider
- css实现二级菜单
- Python3之sqlalchemy
- 61.对决
- 使用css3制作渐变分割线
- NYOJ--811--变态最大值
- NYOJ
- 一个tomcat配置多个端口
- JAVA开发工程师面试题
- 59.兰州烧饼
- Python网络编程之socket编程(一)--使用TCP和UDP客户端和服务器通信
- 十:Callable和Future
- 58.万圣节派对
- ArcGIS 10.3 for Server 在windows下的安装教程
- ViewPager 滑动一半的判断方法以及左滑右滑判断