简单选择排序(Simple Selection Sort)
介绍:
简单选择排序的工作方式突出"选择"二字,每次从待排序数据中选择符合条件的元素放在已排序元素末尾。对于少量元素的排序,简单选择排序是一个有效的算法。
思想:
第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。
性能分析:
时间复杂度:O(N^2)
空间复杂度:O(1)
稳定性:不稳定
代码实现:
// Java代码 class SimpleSelectionSort {public static void selectionSort(int[] a) {for (int i = 0; i < a.length - 1; ++i) {// 遍历序列int minIndex = i;// 记录最小元素位置// 遍历无序序列寻找最小元素for (int j = i + 1; j < a.length; ++j) {if (a[j] < a[minIndex]) {// 更新最小元素下标minIndex = j;}}// 将最小值放到已排序序列的末尾int temp = a[i];a[i] = a[minIndex];a[minIndex] = temp;}} }
// C++代码 class SimpleSelectionSort { public:static void selectionSort(int a[], int length) {for (int i = 0; i < length - 1; ++i) {// 遍历序列int minIndex = i;// 记录最小元素位置// 遍历无序序列寻找最小元素for (int j = i + 1; j < length; ++j) {if (a[j] < a[minIndex]) {// 更新最小元素下标minIndex = j;}}// 将最小值放到已排序序列的末尾int temp = a[i];a[i] = a[minIndex];a[minIndex] = temp;}} };
算法优化:
上面代码一次遍历只是找出未排序序列中的最小值,其实我们可以在遍历过程中同时找出最小值和最大值,并把每次找出的最大值按顺序放到每次排列数据的末尾。时间复杂度还是 O(N^2) ,只相对前面的减少了一半遍历次数。
// Java代码 class SimpleSelectionSort {public static void selectionSort(int[] a) {int left = 0;// 标记未排序序列左边界int right = a.length - 1;// 标记未排序序列右边界while (left < right) {// 遍历未排序序列int minIndex = left;// 记录最小元素位置int maxIndex = left;// 记录最大元素位置// 遍历无序序列寻找最小元素for (int i = left + 1; i <= right; ++i) {if (a[i] < a[minIndex]) {// 更新最小元素下标minIndex = i;}if (a[i] > a[maxIndex]) {// 更新最大元素下标maxIndex = i;}}// 将最小值放到已排序序列的左末尾int temp = a[left];a[left] = a[minIndex];a[minIndex] = temp;if (maxIndex == left) {// 处理最大值为a[left]的特殊情况maxIndex = minIndex;}// 将最大小值放到已排序序列的右末尾temp = a[right];a[right] = a[maxIndex];a[maxIndex] = temp;++left;// 修改未排序序列范围--right;}} }
// C++代码 class SimpleSelectionSort { public:static void selectionSort(int a[], int length) {int left = 0;// 标记未排序序列左边界int right = length - 1;// 标记未排序序列右边界while (left < right) {// 遍历未排序序列int minIndex = left;// 记录最小元素位置int maxIndex = left;// 记录最大元素位置// 遍历无序序列寻找最小元素for (int i = left + 1; i <= right; ++i) {if (a[i] < a[minIndex]) {// 更新最小元素下标minIndex = i;}if (a[i] > a[maxIndex]) {// 更新最大元素下标maxIndex = i;}}// 将最小值放到已排序序列的左末尾int temp = a[left];a[left] = a[minIndex];a[minIndex] = temp;if (maxIndex == left) {// 处理最大值为a[left]的特殊情况maxIndex = minIndex;}// 将最大小值放到已排序序列的右末尾temp = a[right];a[right] = a[maxIndex];a[maxIndex] = temp;++left;// 修改未排序序列范围--right;}} };
简单选择排序(Simple Selection Sort)相关推荐
- 选择排序(Selection sort)是一种简单直观的排序算法
选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大 ...
- 数据结构 - 树形选择排序 (tree selection sort) 具体解释 及 代码(C++)
树形选择排序 (tree selection sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 算法逻辑: 依据节点的大小, ...
- java最全基础知识_Java编程入门,选择排序(Selection Sort)怎么做?
表现最稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,所以用到它的时候,数据规模越小越好.唯一的好处可能就是不占用额外的内存空间了吧.理论上讲,选择排序可能也是平时排序一般人想到的 ...
- 算法:冒泡排序(Bubble Sort)、插入排序(Insertion Sort)和选择排序(Selection Sort)总结...
背景 这两天温习了 5 中排序算法,之前也都看过它们的实现,因为没有深入分析的缘故,一直记不住谁是谁,本文就记录一下我学习的一些心得. 三种排序算法可以总结为如下: 都将数组分为已排序部分和未排序部分 ...
- 选择排序(Selection Sort)
表现最稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,所以用到它的时候,数据规模越小越好.唯一的好处可能就是不占用额外的内存空间了吧.理论上讲,选择排序可能也是平时排序一般人想到的 ...
- 数据结构:选择排序(Selection sort)
package com.sortbasic;import java.util.Random;public class SelectionSortGenerate {// 数组private stati ...
- 排序——选择排序(Selection sort)
算法思想 第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾.以此类推,直到全部待排序的数据元素的 ...
- [转载] python选择排序二元选择_选择排序:简单选择排序(Simple Selection Sort)
参考链接: Python中选择排序Selection Sort 基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的 ...
- c语言用sort函数选择排序,简单选择排序(Simple Selection Sort)的C语言实现
简单选择排序(Simple Selection Sort)的核心思想是每次选择无序序列最小的数放在有序序列最后 演示实例: C语言实现(编译器Dev-c++5.4.0,源代码后缀.cpp) 原创文章, ...
最新文章
- Java常用的集合类
- NOIP2007 树网的核 [BZOJ2282][Sdoi2011]消防
- 专题目录20211013-ongoing
- Oracle日期转换处理
- Highcharts X轴名称太长,如何设置下面这种样式
- 13 Oracle数据库开发与设计入门篇
- linux进程源码分析,Linux内核源代码分析——口述程序猿如何意淫进程(一)
- antd新增一行页码不正确_antd-Table@4.x对rowKey属性的重构
- linux配置caffe环境,ubuntu14.04环境下配置caffe
- SQLSERVER中的BCP命令使用
- JS之形参带默认值的写法代码
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_01-页面静态化需求分析
- 对路径的访问被拒绝怎么办_工作组计算机无法访问,教您无法访问工作组计算机的解决技巧...
- 软考-计算机系统知识整理
- AUTOCAD——Excel表格导入CAD、CAD合并两兄弟
- 涠洲岛形成及地形地貌特征
- c语言ans作用,C语言的递归思想实例分析
- 海尔简爱s11怎么进入bios_海尔简爱s11系统应用商店没有登录界面怎么办?
- 今日只为你狂欢-----JAVA线程总结(零基础入门)
- 记录python开发第一个app,实现word转html的桌面应用