zoukankan      html  css  js  c++  java
  • 选择排序

    本文参考资料:书籍《大话数据结构》,微信公众号:码农有道。

    选择排序介绍

    选择排序是一种简单的排序算法,它的基本原理是:将一个未排序的数列中的元素依次进行比较,把最大或最小值放在第一位,然后再将剩下的未排序的数列元素进行比较,最小值或最大值放在第二个位置;以此类推,直到数列中的元素按照一定的方式拍好序(从大到小或从小到大排列)。

    选择排序原理图解

    以数列{20,40,30,10,60,50}为例,演示其选择排序过程(如下图)。

    排序流程如下:

    第1次:i=0。找出a[1...5]中的最小值a[3]=10,然后将a[0]和a[3]互换。 数组变化:20,40,30,10,60,50 -- > 10,40,30,20,60,50

    第2次:i=1。找出a[2...5]中的最小值a[3]=20,然后将a[1]和a[3]互换。 数组变化:10,40,30,20,60,50 -- > 10,20,30,40,60,50

    第3次:i=2。找出a[3...5]中的最小值,由于该最小值大于a[2],该趟不做任何处理。 

    第4次:i=3。找出a[4...5]中的最小值,由于该最小值大于a[3],该趟不做任何处理。 

    第5次:i=4。交换a[4]和a[5]的数据。 数组变化:10,20,30,40,60,50 -- > 10,20,30,40,50,60

    选择排序代码

    #include<stdio.h>
    #define MAXSIZE 10    //用于排序的数组个数的最大值,可修改
    #define OK 1
    #define TRUE 1
    #define FALSE 0
    typedef int Status;    
    
    //定义一个用于排序的顺序表结构
    typedef struct {
        int r[MAXSIZE];
        int length;        //用于记录顺序表的长度
    }SqList;
    
    //交换数组中下标为i和j的元素值
    void swap(SqList *L,int i,int j){
        int temp;
        temp = L->r[i];
        L->r[i] = L->r[j];
        L->r[j] = temp;
        return OK;
    }
    
    //对顺序表L做简单的选择排序
    void SelectSort(SqList *L){
        int i , j ,min;
        for(i = 0; i < L->length; i++){
            min = i;    //将当前下标定义成最小值下标
            for(j = i + 1; j < L->length; j++){
                if(L->r[min] > L->r[j]){    //如果小于当前最小值的关键字
                    min = j;    //将此关键字的下标赋值为min
                }
            }
            if(min != i){
                swap(L,i,min);
            }
        }
    }

    算法复杂度和稳定性分析

    选择排序的时间复杂度是O(N2):假设被排序的数列中有N个数。遍历一趟的时间复杂度是O(N),需要遍历多少次呢?N-1次因此,选择排序的时间复杂度是O(N2)。

    选择排序是稳定的算法,它满足稳定算法的定义:假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!

    尽管选择排序和冒泡排序复杂度相同,但是由于选择排序减少了数据交换的次数,所以在性能上要优于冒泡排序。

  • 相关阅读:
    算法导论(第三版)Exercises2.1(插入排序、线性查找、N位大数相加)
    含铝馒头可能损伤儿童的智力
    每秒3600乘以100等于36万次售票解决方案
    namespace Measure
    public interface ICloneable
    VB.net 与线程
    C#调用VP 包含素材
    C# 定时器 一个简单 并且可以直接运行的Demo
    松下 激光位移传感器 API
    在Win7系统下, 使用VS2015 打开带有日文注释程序出现乱码的解决方案
  • 原文地址:https://www.cnblogs.com/yuliangbin/p/8875727.html
Copyright © 2011-2022 走看看