选择排序跟冒泡排序的比较
2015-06-29 11:26
176 查看
/*时间复杂度
选择排序:比较次数O(n^2)总的比较次数N=(n-1)+(n-2)+…+1=n*(n-1)/2。交换次数O(n),最好情况是,已经有序,交换0次;最坏情况交换n-1次,逆序交换n/2次。交换次数比冒泡排序少多了,由于交需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。
冒泡排序:若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数为n-1,交换次数为0,所以,冒泡排序最好的时间复杂度为O(n); 若初始文件是反序的,需要进行趟排序。每趟排序要进行次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:C = n*(n-1)/2 M = 3n*(n-1)/2。
*/
选择排序:比较次数O(n^2)总的比较次数N=(n-1)+(n-2)+…+1=n*(n-1)/2。交换次数O(n),最好情况是,已经有序,交换0次;最坏情况交换n-1次,逆序交换n/2次。交换次数比冒泡排序少多了,由于交需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。
冒泡排序:若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数为n-1,交换次数为0,所以,冒泡排序最好的时间复杂度为O(n); 若初始文件是反序的,需要进行趟排序。每趟排序要进行次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:C = n*(n-1)/2 M = 3n*(n-1)/2。
*/
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <stdbool.h> //选择排序,找出每一轮最小元素放在本轮开头位置 void SelectSort(int arr[], int length) { int tmp, i, j; for(i = 0; i < length-1; i++) { for(j = i+1; j < length; j++) { if(arr[i] > arr[j]) { tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } } } /* 优化后的选择排序算法 for(i = 0; i < length-1; i++)//length个元素需要比较length-1轮 { int index = i;//假设index为每轮比较后最小的元素下标 ,初始值为每轮第一个元素 for(j = i+1; j < length; j++) { if(arr[j] < arr[index])//index代表一局内最小的那个 index = j; } if(index != i) { tmp = arr[index]; arr[index] = arr[i]; arr[i] = tmp; } } */ } //冒泡排序,每次找到轮内最大的放在本轮的最后位置 void BubbleSort(int arr[], int length) { int i, j, tmp; for(i = 0; i < length-1; i++) { for(j = 0; j < length-1-i; j++) { if(arr[j] > arr [j+1]) { tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } } /*冒泡排序的优化 bool flag = true; for(i = 0; i < length-1 && flag; i++) { flag = false; for(j = 0; j < length-1-i; j++) { if(arr[j] > arr [j+1]) { tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; flag = true; } } } */ } void main() { int arr[8] = {2,8,5,3,4,7,9,10}; int i; for(i = 0; i < 8; i++) { printf("%d ", arr[i]); } printf("\n"); BubbleSort(arr, 8); for(i = 0; i < 8; i++) { printf("%d ", arr[i]); } printf("\n"); }
相关文章推荐
- 技术总结
- RPC原理详解
- OOA/OOD/OOP
- 欢迎使用CSDN-markdown编辑器
- ActionBar隐藏方法
- linux下项目发布
- 在Go程序中实现服务器重启的方法
- C++ Primer 学习笔记_27_STL实践与分析(1) --顺序容器的定义、迭代器
- LeetCode_65---Valid Number
- git与github
- 单点登录SSO的实现原理
- java学习——equals()和==的比较
- Newtonsoft.Json高级用法
- Android 超高仿微信图片选择器 图片该这么加载
- ReleaseMutex用法
- [C#]浅析ref、out参数
- 深入浅出AOP(三)--WCF+AOP
- LeetCode_64---Minimum Path Sum
- 人 定 胜天
- cocos2dx 如何制作一个使用世界坐标系的精灵