选择排序算法

选择排序算法

转自:傅红雪 http://www.cnblogs.com/fuhongxue2011/archive/2011/05/24/2055825.html 

 

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

一、基本思想:

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

直接选择排序是不稳定的

posted @ 2012-02-22 11:50  nightmare23  阅读(172)  评论(0)    收藏  举报