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

    每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

    一、基本思想:

    n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。

    1、初始状态

    无序区为R[1…n],有序区为空

    2、第1趟排序

    在无序区R[1…n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1…1]和R[2…n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

    ……

    3、第i趟排序

    第i趟排序开始时,当前有序区和无序区分别为R[1…i-1]和R[i…n](1<=i<=n-1)。该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R[i]交换,使R[1…i]和R[i+1…n]分别变为记录个数增加一个的新有序区和记录个数减少1个的新无序区。

    这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。

    二、排序过程

    初始关键字 [49 38 65 97 76 13 27 49]

    第一趟排序后 13 [38 65 97 76 49 27 49]

    第二趟排序后 13 27 [65 97 76 49 38 49]

    第三趟排序后 13 27 38 [97 76 49 65 49]

    第四趟排序后 13 27 38 49 [76 97 65 49 ]

    第五趟排序后 13 27 38 49 49 [97 65 76]

    第六趟排序后 13 27 38 49 49 65 [97 76]

    第七趟排序后 13 27 38 49 49 65 76 [97]

    最后排序结果 13 27 38 49 49 65 76 97

    三、代码示例

    选择排序
    using System;
    using System.Collections.Generic;

    namespace SelectSortService
    {
    public class SelectSortService
    {
    static void Main(string[] args)
    {
    // 判断参数
    int argsLength = args.Length;
    if (argsLength == 0)
    {
    Console.WriteLine(
    "请输入参数!");
    return;
    }
    int arg;
    int[] sortArray = new int[argsLength];
    for (int i = 0;i < argsLength; i++)
    {
    if (!int.TryParse(args[i], out arg))
    {
    Console.WriteLine(
    "参数必须全都为数字!");
    return;
    }
    sortArray[i]
    = arg;
    }

    // 排序
    SelectSortService select = new SelectSortService();
    sortArray
    = select.SelectSort(sortArray);
    }

    /// <summary>
    /// 选择排序算法
    /// </summary>
    /// <param name="arr">数字数组</param>
    /// <returns>排好序的数字数组</returns>
    public int[] SelectSort(int[] arr)
    {
    int k, temp;
    for (int i = 0; i < arr.Length - 1; i++)
    {
    k
    = i;
    for (int j = i + 1; j < arr.Length; j++)
    {
    if (arr[k] > arr[j])
    {
    k
    = j;
    }
    }
    if (k != i)
    {
    temp
    = arr[i];
    arr[i]
    = arr[k];
    arr[k]
    = temp;
    }

    Console.WriteLine(
    "");
    foreach (var item in arr)
    {
    Console.Write(item
    + " ");
    }
    }
    return arr;
    }
    }
    }

    运行结果:

    四、算法分析

    1、时间复杂度

    A、记录比较次数

    无论待排序数组初始状态如何,都要进行n-1趟选择排序:

    第1趟:比较n-1次

    第2趟:比较n-2次

    ……

    第n-1趟,比较1次

    从而:总共的比较次数为1+2+…+(n-1)=n(n-1)/2

    B、记录移动次数

    如果待排序数组为正序,则记录不需要交换,记录移动次数为0

    如果当排序数组为逆序,则:

    第1趟:交换1次,移动3次;

    第2趟:交换1次,移动3次;

    ……

    第n-1趟:交换1次,移动3次。

    从而,总共的移动次数为:3(n-1)

    因此,时间复杂度为O(n2);

    2、空间复杂度

    在选择排序的过程中,设置一个变量用来交换元素,所以空间复杂度为O(1)

    3、排序稳定性

    直接选择排序是不稳定的

  • 相关阅读:
    windows系统切换jdk,修改java_home无效情况
    Cannot instantiate interface org.springframework.context.ApplicationListener
    MySQL分组查询获取每个学生前n条分数记录(分组查询前n条记录)
    ASP.NET Web API 使用Swagger生成在线帮助测试文档,支持多个GET
    EF TO MYSQL 无法查询中文的解决方法
    HttpWebRequest post请求获取webservice void数据信息
    This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms. 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分 解决方案
    MySQL 5.7.13解压版安装记录 mysql无法启动教程
    C# udpclient 发送数据断网后自动连接的方法
    汽车XX网站秒杀抢购代码
  • 原文地址:https://www.cnblogs.com/puwei222/p/2055825.html
Copyright © 2011-2022 走看看