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]前面。则这个排序算法是稳定的!

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

  • 相关阅读:
    Oracle架构实现原理、含五大进程解析(图文详解)
    Oracle架构实现原理、含五大进程解析(图文详解)
    mysqldump --flush-logs
    mysql dump 参数
    Windows 8.1 PLSQL_32连接到RHEL6.1 Oracle10gr2_64
    Windows 8.1 PLSQL_32连接到RHEL6.1 Oracle10gr2_64
    echarts-单柱状图
    echarts-all.js:1 Dom’s width & height should be ready before init.
    如果是在有master上开启了该参数,记得在slave端也要开启这个参数(salve需要stop后再重新start),否则在master上创建函数会导致replaction中断。
    mysql 创建函数 error Code: 1227. Access denied;
  • 原文地址:https://www.cnblogs.com/yuliangbin/p/8875727.html
Copyright © 2011-2022 走看看