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

    概要

    本章介绍排序算法中的选择排序。

    目录
    1. 选择排序介绍
    2. 选择排序图文说明
    3. 选择排序的时间复杂度和稳定性
    4. 选择排序实现
    4.1 选择排序C实现
    4.2 选择排序C++实现
    4.3 选择排序Java实现

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3597641.html


    更多内容:数据结构与算法系列 目录

    选择排序介绍

    选择排序(Selection sort)是一种简单直观的排序算法。
    它的基本思想是:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

    选择排序图文说明

    选择排序代码

    /*
     * 选择排序
     *
     * 参数说明:
     *     a -- 待排序的数组
     *     n -- 数组的长度
     */
    void select_sort(int a[], int n)
    {
        int i;        // 有序区的末尾位置
        int j;        // 无序区的起始位置
        int min;    // 无序区中最小元素位置
    
        for(i=0; i<n; i++)
        {
            min=i;
    
            // 找出"a[i+1] ... a[n]"之间的最小元素,并赋值给min。
            for(j=i+1; j<n; j++)
            {
                if(a[j] < a[min])
                    min=j;
            }
    
            // 若min!=i,则交换 a[i] 和 a[min]。
            // 交换之后,保证了a[0] ... a[i] 之间的元素是有序的。
            if(min != i)
                swap(a[i], a[min]);
        }
    }

    下面以数列{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

     

    选择排序的时间复杂度和稳定性

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

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

    选择排序实现

    选择排序C实现
    实现代码(select_sort.c)

     1 /**
     2  * 选择排序:C 语言
     3  *
     4  * @author skywang
     5  * @date 2014/03/11
     6  */
     7 
     8 #include <stdio.h>
     9 
    10 // 数组长度
    11 #define LENGTH(array) ( (sizeof(array)) / (sizeof(array[0])) )
    12 #define swap(a,b) (a^=b,b^=a,a^=b)
    13 
    14 /*
    15  * 选择排序
    16  *
    17  * 参数说明:
    18  *     a -- 待排序的数组
    19  *     n -- 数组的长度
    20  */
    21 void select_sort(int a[], int n)
    22 {
    23     int i;        // 有序区的末尾位置
    24     int j;        // 无序区的起始位置
    25     int min;    // 无序区中最小元素位置
    26 
    27     for(i=0; i<n; i++)
    28     {
    29         min=i;
    30 
    31         // 找出"a[i+1] ... a[n]"之间的最小元素,并赋值给min。
    32         for(j=i+1; j<n; j++)
    33         {
    34             if(a[j] < a[min])
    35                 min=j;
    36         }
    37 
    38         // 若min!=i,则交换 a[i] 和 a[min]。
    39         // 交换之后,保证了a[0] ... a[i] 之间的元素是有序的。
    40         if(min != i)
    41             swap(a[i], a[min]);
    42     }
    43 }
    44 
    45 void main()
    46 {
    47     int i;
    48     int a[] = {20,40,30,10,60,50};
    49     int ilen = LENGTH(a);
    50 
    51     printf("before sort:");
    52     for (i=0; i<ilen; i++)
    53         printf("%d ", a[i]);
    54     printf("
    ");
    55 
    56     select_sort(a, ilen);
    57 
    58     printf("after  sort:");
    59     for (i=0; i<ilen; i++)
    60         printf("%d ", a[i]);
    61     printf("
    ");
    62 }
    View Code

    选择排序C++实现
    实现代码(SelectSort.cpp)

     1 /**
     2  * 选择排序:C++
     3  *
     4  * @author skywang
     5  * @date 2014/03/11
     6  */
     7 
     8 #include <iostream>
     9 using namespace std;
    10 
    11 /*
    12  * 选择排序
    13  *
    14  * 参数说明:
    15  *     a -- 待排序的数组
    16  *     n -- 数组的长度
    17  */
    18 void selectSort(int* a, int n)
    19 {
    20     int i;        // 有序区的末尾位置
    21     int j;        // 无序区的起始位置
    22     int min;    // 无序区中最小元素位置
    23 
    24     for(i=0; i<n; i++)
    25     {
    26         min=i;
    27 
    28         // 找出"a[i+1] ... a[n]"之间的最小元素,并赋值给min。
    29         for(j=i+1; j<n; j++)
    30         {
    31             if(a[j] < a[min])
    32                 min=j;
    33         }
    34 
    35         // 若min!=i,则交换 a[i] 和 a[min]。
    36         // 交换之后,保证了a[0] ... a[i] 之间的元素是有序的。
    37         if(min != i)
    38         {
    39             int tmp = a[i];
    40             a[i] = a[min];
    41             a[min] = tmp;
    42         }
    43     }
    44 }
    45 
    46 int main()
    47 {
    48     int i;
    49     int a[] = {20,40,30,10,60,50};
    50     int ilen = (sizeof(a)) / (sizeof(a[0]));
    51 
    52     cout << "before sort:";
    53     for (i=0; i<ilen; i++)
    54         cout << a[i] << " ";
    55     cout << endl;
    56 
    57     selectSort(a, ilen);
    58 
    59     cout << "after  sort:";
    60     for (i=0; i<ilen; i++)
    61         cout << a[i] << " ";
    62     cout << endl;
    63 
    64     return 0;
    65 }
    View Code

    选择排序Java实现
    实现代码(SelectSort.java)

     1 /**
     2  * 选择排序:Java
     3  *
     4  * @author skywang
     5  * @date 2014/03/11
     6  */
     7 
     8 public class SelectSort {
     9 
    10     /*
    11      * 选择排序
    12      *
    13      * 参数说明:
    14      *     a -- 待排序的数组
    15      *     n -- 数组的长度
    16      */
    17     public static void selectSort(int[] a, int n) {
    18         int i;        // 有序区的末尾位置
    19         int j;        // 无序区的起始位置
    20         int min;    // 无序区中最小元素位置
    21 
    22         for(i=0; i<n; i++) {
    23             min=i;
    24 
    25             // 找出"a[i+1] ... a[n]"之间的最小元素,并赋值给min。
    26             for(j=i+1; j<n; j++) {
    27                 if(a[j] < a[min])
    28                     min=j;
    29             }
    30 
    31             // 若min!=i,则交换 a[i] 和 a[min]。
    32             // 交换之后,保证了a[0] ... a[i] 之间的元素是有序的。
    33             if(min != i) {
    34                 int tmp = a[i];
    35                 a[i] = a[min];
    36                 a[min] = tmp;
    37             }
    38         }
    39     }
    40 
    41     public static void main(String[] args) {
    42         int i;
    43         int[] a = {20,40,30,10,60,50};
    44 
    45         System.out.printf("before sort:");
    46         for (i=0; i<a.length; i++)
    47             System.out.printf("%d ", a[i]);
    48         System.out.printf("
    ");
    49 
    50         selectSort(a, a.length);
    51 
    52         System.out.printf("after  sort:");
    53         for (i=0; i<a.length; i++)
    54             System.out.printf("%d ", a[i]);
    55         System.out.printf("
    ");
    56     }
    57 }
    View Code

    上面3种实现的原理和输出结果都是一样的。下面是它们的输出结果:

    before sort:20 40 30 10 60 50 
    after  sort:10 20 30 40 50 60
  • 相关阅读:
    C# WCF的POST请求包含Stream及多个参数
    C# Fakes
    C# 计算文件的MD5
    C# 获取计算机的硬件、操作系统信息
    整数拆分
    整数拆分问题的四种解法【转载】
    python爬虫
    【转载】Scrapy安装及demo测试笔记
    Python野生库
    【转载】python3安装scrapy之windows32位爬坑
  • 原文地址:https://www.cnblogs.com/skywang12345/p/3597641.html
Copyright © 2011-2022 走看看