排序算法(二)选择排序解法及优化
来源:互联网 发布:电子导游软件 编辑:程序博客网 时间:2024/05/21 06:38
选择排序的思想比较简单,它的工作原理是每次从待排序的序列中选择最大(或最小)的一个元素,放到序列的开头(或结尾),直到整个序列有序为止。
这种方法非常简单,代码如下:
void SelectSort(int arr[], int len){ int i = 0; int j = 0; int min = 0; for (i = 0; i < len; i++) { min = i; for (j = i + 1; j < len; j++)//从无序区找最小元素 { if (arr[j] < arr[min]) { min = j; } } if (i != min)//如果无序区的第一个位置不是最小元素才交换 { swap(arr[i], arr[min]); } }
既然我们每次找最小元素都要遍历一遍待排序的序列,为了提高效率,我们也可以每次从待排序序列中找一个最大数,找一个最小数。这种解法和上面的方法类似,但是要注意一种情况:如果arr[min]是当前无序序列中的最大元素,arr[max]是当前无序序列中最小元素时,例如,待排序列剩下两个元素5,4,则交换会导致下图情况:
为了避免下图中的情况,我们在程序开始应该先判断arr[min]是否大于arr[max],如果大于则交换。
如下给出给出两种解法:
void SelectSort(int arr[], int len){ int min = 0; int max = len-1; int i = 0; int minIndex = 0; int maxIndex = 0; while(min<max) { int minIndex = min; int maxIndex = max; if (arr[min] > arr[max])//避免arr[min]为最大元素,arr[max]为最小元素,交换后混乱的情况 { swap(arr[min], arr[max]); } for (i = min; i <=max; i++) { if (arr[i] < arr[minIndex]) minIndex = i; if (arr[i] > arr[maxIndex]) maxIndex = i; } if(minIndex!=min) { swap(arr[minIndex], arr[min]); } if (maxIndex != max) { swap(arr[maxIndex], arr[max]); } min++; max--; } }
void SelectSort(int arr[],int len){ int min=0;//最小元素下标 int max=len-1;//最大元素下标 int i=0; while (min <= max) { i=min+1; while (i>=min && i<=max ) { if (arr[min]>arr[max])//避免arr[min]为最大元素,arr[max]为最小元素,交换后混乱的情况 { swap(arr[min],arr[max]); } if(arr[i]<arr[min]) { swap(arr[i],arr[min]); } if (arr[i]>arr[max]) { swap(arr[i],arr[max]); } i++; } min++; max--; }}
0 0
- 排序算法(二)选择排序解法及优化
- 排序算法(四)选择排序及优化版本
- 排序算法(二)——选择排序及改进
- 排序算法(二)——选择排序及改进
- 排序算法(二)——选择排序及改进
- 排序算法(二):直接选择排序
- 排序算法(二)简单选择排序
- 排序算法(二)------选择排序
- 排序算法(二):选择排序法
- 排序算法(二)-- 选择排序
- 排序算法之选择排序(二)
- 选择排序优化算法
- 选择排序及优化
- 排序算法《二》选择排序
- 排序算法二:选择排序
- 排序算法二:选择排序
- 排序算法(二):选择排序
- 排序算法(二)-选择排序
- Node.js发送HTTP请求
- 88-非阻塞 connect 版本的 web 客户程序
- WEB前端:浏览器(IE+Chrome+Firefox)常见兼容问题处理--03
- wenda1.1 使用vue-cli webpack
- windows下的文件基本操作
- 排序算法(二)选择排序解法及优化
- C. Naming Company 几何
- 彻底搞懂C++左值与右值
- Longest Substring Without Repeating Characters
- 合并排序的递归算法和非递归算法、快速排序算法
- Unity学习笔记(2)- MonoBehaviour类的生命周期及脚本报错收集
- 有关数组的运算
- Spark取出(Key,Value)型数据中Value值为前n条数据
- Interpreter解释器模式