zoukankan      html  css  js  c++  java
  • 选择排序及其复杂度分析

    • 问题:给定一个整数序列,按照从小到大的顺序(确切地说,是非递减的顺序)排列序列中的整数。
    • 输入:一个整数序列。
    • 输出:整数序列,其中的整数升序排列。

    选择排序的思想:选出最小的一个和第一个位置交换,选出其次小的和第二个位置交换 ……
    直到从第N个和第N-1个元素中选出最小的放在第N-1个位置。

    选择排序的C语言实现如下:

    void sel_sort(int *a, size_t size)
    {
        int i, j;
        int min_index;
        int t;
        for(i = 0; i < size - 1; i ++){
            min_index = i;
            for( j = i + 1; j < size; j++){
                if(a[j] < a[min_index])
                    min_index = j;
            }
            if (min_index != i){
                t = a[i];
                a[i] = a[min_index];
                a[min_index] = t;
            }
        }
    }
    

    选择排序的Python实现如下:

    def selection_sort(int_list):
        l = len(int_list)
        for i in range(0, l - 1):
            min = i
            for j in range(i + 1, l):
                if int_list[j] < int_list[min]:
                    min = j
            if i != min:
                t = int_list[i]
                int_list[i] = int_list[min]
                int_list[min] = t
    

    选择排序的复杂度分析。第一次内循环比较N - 1次,然后是N-2次,N-3次,……,最后一次内循环比较1次。
    共比较的次数是 (N - 1) + (N - 2) + ... + 1,求等差数列和,得 (N - 1 + 1)* N / 2 = N^2 / 2
    舍去最高项系数,其时间复杂度为 O(N^2)

    虽然选择排序和冒泡排序的时间复杂度一样,但实际上,选择排序进行的交换操作很少,最多会发生 N - 1次交换。
    而冒泡排序最坏的情况下要发生N^2 /2交换操作。从这个意义上讲,交换排序的性能略优于冒泡排序。
    而且,交换排序比冒泡排序的思想更加直观。

    2015-03-18 Wed

    本系列文章(更新中):

    1. 冒泡排序及其复杂度分析
    2. 选择排序及其复杂度分析
    3. 插入排序及其复杂度分析
  • 相关阅读:
    linux下tomcat之too many open files
    oracle之Io异常: Got minus one from a read call
    oracle监听模块异常
    面向对象分析与面向结构分析
    jdbc连接oracle出现ORA-12505错误
    git命令行入门
    oracle之远程数据投毒漏洞(CVE-2012-1675)修复
    sql盲注
    springboot日志配置Logback
    Java 多线程 重入锁
  • 原文地址:https://www.cnblogs.com/jiqingwu/p/selection_sort_algorithm.html
Copyright © 2011-2022 走看看