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、排序稳定性

    直接选择排序是不稳定的

  • 相关阅读:
    Struts2 与 Spring MVC
    RESTful Web Service
    [找程序员代写推荐]spring Scurity终于测试OK了,复杂的功能还待深入研究!发布出来一起探讨吧!
    [找程序员代写推荐]1、拖地要30分钟, 只有一个拖把 2、擦窗要30分钟, 只有一块抹布 3、切菜要30分钟, 只有一把刀 假设只有以上工具才能完成工作时,完成此三件 工作需要两个人工作多长时间?
    [原]精简高效CSS系列之二——浮动float
    [找程序员代写推荐]struts2验证+拦截器+国际化+下载excle文档+struts2二级联动+OGNL表达试+ssh集成部分代码, 项目下载、
    [原]精简高效CSS系列之一——CSS样式用法
    [原]反对网抄,没有规则可以创建目标&quot;install&quot; 靠谱解答
    如何鉴别程序抄袭c语言程序代写
    [原]CSS+DIV总结
  • 原文地址:https://www.cnblogs.com/puwei222/p/2055825.html
Copyright © 2011-2022 走看看