排序之简单选择排序

前言

  本篇博客是在伍迷兄的博客基础上进行的,其博客地址点击就可以进去,里面好博客很多,我的排序算法都来自于此;一些数据结构方面的概念我就不多阐述了,伍迷兄的博客中都有详细讲解,而我写这些博客只是记录自己学习过程,加入了一些自己的理解,同时也希望给别人提供帮助。

基本思想

  选择排序的基本思想是每一趟在n-i+1(i=1,2,…,n-1)个记录中选取关键字最小的记录作为有序序列的第i个记录。我们这里先介绍的是简单选择排序法。简单选择排序法(Simple Selection Sort)就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1≤i≤n)个记录交换之,就是说一刚开始,从序列arr[0...n-1]选出最小的元素与第1个记录即arr[0]交换,再从arr[1...n-1]中选出最小的与arr[1]进行交换,arr[2...n-1]中最小的与arr[2]进行交换,以此类推,直至整个序列有序。

代码实现

  /**
     * 简单选择排序
     * @param arr
     */
    public static void simpleSelectSort(int[] arr){
        int len = arr.length;
        int index;                                // 记录arr[i...len-1]最小元素的下标
        for(int i=0; i<len; i++){
            index = i;
            for(int j=i+1; j<len; j++){            // 寻找arr[j...len-1]中最小元素
                if(arr[index] > arr[j]){
                    index = j;
                }
            }
            swap(arr,i,index);                    // 交换arr[i]和arr[index]
        }
    }

执行过程模拟

  上面的代码应该是很容易理解的,不过我们还是来模拟一下计算机执行的过程。

  1)一开始,初始序列是{5,3,7,9,1,6,4,8,2},i=0,index=i=0,j=i+1=1,初始时,状态如下

  2)i=0时

  3)i=1时,同理,交换如下

  4)i=2,3,4,5,6,7,8时,如下

  至此,整个序列已经从小到大有序了;当然,从上面的模拟过程可以看出来,算法是可以些许改善的,改善的事就交给各位看官了,就当是拓展

总结

  简单排序算法还是比较简单的,没什么难点,希望大家能够在我提供的代码实现上进行些许优化,比如当i=index时,不需要优化,等等!

时间: 2024-10-27 08:55:34

排序之简单选择排序的相关文章

经典排序算法--简单选择排序

算法简介 简单选择排序是一种选择排序. 选择排序:每趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录序列末尾,直到全部排序结束为止. 白话理解 依然已排队为例,在排队时,有的老师可能会选择这样排序,先在一列中选出最矮的,放在第一位,然后选出第二矮的,放在第二位.队伍完成排序.而这就是选择排序的思想. 简单排序处理流程 (1)从待排序序列中,找到关键字最小的元素: (2)如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换: (3)从余下的 N - 1 个元素中,找出关键字最小

排序——直接选择排序(简单选择排序)

直接选择排序也称简单选择排序,是一种相对简单的排序算法,它的基本思想是:从一列数中找出最小的,和第一个交换:剩下的重新找出最小的,和这列数的第二个交换,......一直进行n-1次比较之后,该数列已经为有序数列了. 例如:已知一组无序数列:6 3 5 1 4 2 9 第一次:[6 3 5 1 4 2 9] 最小数为:1 第二次:1 [3 5 6 4 2 9] 最小数为:2 第三次:1 2 [5 6 4 3 9] 最小数为:3 第四次:1 2 3 [6 4 5 9] 最小数为:4 第五次:1 2

选择排序——1简单选择排序实现

public void SelectSort(int[] ary) { // 需要遍历获得最小值的次数 for (int i = 0; i < ary.Length - 1; i++) { int temp = 0; int index = i; // 用来保存最小值得索引 //在后面的序列中,寻找最小的数 for (int j = i + 1; j < ary.Length; j++) { if (ary[index] > ary[j]) { index = j; } } //交换位置

排序五 简单选择排序

要点 简单选择排序是一种选择排序. 选择排序:每趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录序列末尾,直到全部排序结束为止. 简单排序处理流程: ( 1 )从待排序序列中,找到关键字最小的元素:( 2 )如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换:( 3 )从余下的 N - 1 个元素中,找出关键字最小的元素,重复( 1 ).( 2 )步,直到排序结束. 如图所示,每趟排序中,将当前第 i 小的元素放在位置 i 上. 核心代码 public void selec

4.3_8种常用排序算法3(选择排序:简单选择排序+堆排序)

[简单选择排序] package com.sort.demo3; import java.util.Arrays; /** * 简单选择排序 */ public class SelectSort { public static void main(String[] args) { int[] arr = new int[]{1,4,5,7,3,9,8,0,2,6}; System.out.println(Arrays.toString(arr)); selectSort(arr); System

C语言排序算法——简单选择排序算法

冒泡排序算法的思想是不断的交换,通过交换完成最终的排序. 选择排序的基本思想是每一趟在n-i+1个记录中选取最小的记录,作为第i个的记录. 1 void SimpleSelectSort(int *p) 2 { 3 int i,j,min; 4 for(i=0;i<10;i++) 5 { 6 min=i;    //将当前下标定义为最小下标 7 for(j=i+1;j<10;j++) 8 { 9 if(p[min>p[j]])    //如果有小于当前最小值的 10 { 11 min=j

选择排序-简单选择排序

代码 [3, 1, 5, 7, 2, 4, 9, 6]--把全部的最小的数(1)的和第 1 个数(3)交换位置 [1, 3, 5, 7, 2, 4, 9, 6]--把余下的最小的数(2)的和第 2 个数(3)交换位置 [1, 2, 5, 7, 3, 4, 9, 6]--把余下的最小的数(3)的和第 3 个数(5)交换位置 [1, 2, 3, 7, 5, 4, 9, 6]--把余下的最小的数(4)的和第 4 个数(7)交换位置 第五轮不交换-----把余下的最小的数(5)的和第 5 个数(5)交换

对于近似有序序列(即除掉少数K个元素后是有序序列且K&lt;&lt;n),试分析直接插入排序,冒牌排序和简单选择排序的时间复杂度

学弟问的一道数据结构的题,关于一些排序算法的时间复杂度. 针对近似有序序列, ①当使用直接插入排序时,其基本操作为数组中元素的移动.最好情况下,待排序列有序,无需移动,此时时间复杂度为O(n), 当为近似有序序列是,其基本操作执行的次数是K次当前循环的最大值的和,即时间复杂度为O(k.n)由于k远小于n, 综合考虑直接插入排序的时间复杂度为O(n) ②当使用冒泡排序时,默认为普通冒泡排序,其基本操作为元素间比较的次数,因此无论 是否是近似有序,时间复杂度均为O(n^2) ③当使用简单排序时,其基

【选择排序】简单选择排序

思想:每经过一趟比较就找出一个最小值,与待排序列最前面的位置互换即可. 算法分析:时间复杂度O(n2):稳定性:不稳定. 1 #include <stdio.h> 2 3 void SelectSort(int a[], int len) 4 { 5 int i, j, k, tmp; 6 for (i = 0; i < len - 1; i++) 7 { 8 k = i; 9 for (j = i + 1; j < len; j++) 10 { 11 if (a[j] <