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

    直接选择排序是不稳定的

  • 相关阅读:
    PHP伪造referer访问地址
    第一个伪静态(url重写)测试
    url重写(伪静态)IIS配置图解
    两个DropDownList数据绑定联动(数据库)
    PlaceHolder
    Page之IsPostBack属性
    确定删除吗?
    很喜欢的一个组合 因为他们的音乐改变了我对许多事物的看法SAVAGE GARDEN
    DragonBones 骨骼动画引擎
    关于Flash的Sockt通信与跨域文件
  • 原文地址:https://www.cnblogs.com/puwei222/p/2055825.html
Copyright © 2011-2022 走看看