美文网首页八大排序算法
简单选择排序及其优化(C#)

简单选择排序及其优化(C#)

作者: 倚剑赏雪 | 来源:发表于2020-02-27 17:22 被阅读0次

基本思想

就是首先扫描整个数组,找到最小的元素,然后和第一个元素进行交换,如此一来就等同于将最小的元素放到它在有序表中最终的位置上。然后从第二个元素开始扫描整个表,找到剩余n-1个元素中最小的元素,与第二个元素交换位置。以此类推,在执行n-1遍之后,这个数组就自然有序了。(当然每次找最大的元素,与最后一个元素交换也是可行的)

复杂度

选择排序有一个最明显的优于冒泡排序的地方:数据交换的次数。在选择排序中,一共最多产生n-1次交换(有时当剩余数组第一个值就是最小值的时候甚至不需要进行交换), 虽然选择排序的时间复杂度也是O(n^2),选择排序的空间复杂度也是O(1)。

稳定性

不稳定排序

总结

选择排序优缺点:

优点:一轮比较只需要换一次位置;

缺点:效率慢,不稳定(举个例子5,8,5,2,9 我们知道第一遍选择第一个元素5会和2交换,那么原序列中2个5的相对位置前后顺序就破坏了)。

    /// <summary>
    /// 简单选择排序
    /// </summary>
    /// <param name="array">排序数组</param>
    void OptBase(int[] array)
    {
        if (array.Length < 2) return;
        int minIdx;
        for (int i = 0; i < array.Length; i++)
        {
            //每次循环开始,重置坐标
            minIdx = i;
            //前i个已经有序
            //内循环是在[i,array.length-1]的区间找出最小的元素位置,和第i个进行交换
            for (int j = i; j < array.Length; j++)
            {
                if (array[j] < array[minIdx]){
                    minIdx = j;
                }
            }
            //判断第i个不是最小的进行减缓,是的话不做处理
            if(i != minIdx)
            {
                Swap(array, minIdx, i);
            }
        }
    }

优化

可以一次性地找到最大值和最小值,分别和头、尾两个元素进行交换。 这样一来外循环只要执行原来一半的循环次数就可以了。但是需要注意一点:每次循环要进行2次交换,第一次最小值交换结束之后,在进行最大值交换的时候要先判断,最大值是不是在第一个位置,在第一次最小值交换的时候已经换到了后面?所以要先交换最小的,再交换最大的

    /// <summary>
    /// 简单选择排序的优化
    /// </summary>
    /// <param name="array">排序数组</param>
    void OptOptimize(int[] array)
    {
        if (array.Length < 2) return;
        //一次找到最大值和最小值
        int minIdx, maxIdx;
        //外循环遍历一半结束
        //如果完整遍历,整个数组都会变成倒序排列
        for (int i = 0; i < array.Length; i++)
        {
            minIdx = i;
            maxIdx = i;
            //内循环从两边缩进
            for (int j = i; j < array.Length-i; j++)
            {
                if (array[j] < array[minIdx])
                {
                    minIdx = j;
                }
                if (array[j] > array[maxIdx])
                {
                    maxIdx = j;
                }
            }
            if (i != minIdx)
            {
                Swap(array, i, minIdx);
            }
            if(array.Length-1-i != maxIdx)
            {
                //防止最大数在第一个,优先和最小值进行交换
                if(i == maxIdx)
                {
                    Swap(array, array.Length - 1 - i, minIdx);
                }
                else
                {
                    Swap(array, array.Length - 1 - i, maxIdx);
                }
            }
        }
    }
  //互换函数
   void Swap(int[] arr, int index1, int index2)
    {
        int temp = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = temp;
    }

相关文章

  • 简单选择排序及其优化(C#)

    基本思想 就是首先扫描整个数组,找到最小的元素,然后和第一个元素进行交换,如此一来就等同于将最小的元素放到它在有序...

  • 选择排序及其简单优化

    选择排序是不稳定的排序算法,譬如[8, 8, 2],在第一轮选择的时候是选择到最小值2,第一个8与2交换后两个8之...

  • 选择排序及其优化

    选择排序:外循环循环一轮,就是拿这个固定位置的数与后面比较,确保当前这个位置的数是这个位置之后的所有数据的最小值....

  • 选择排序及其优化

    基本思想 这是思路最简单的排序算法。 找到数组中最小的那个元素; 将它和数组的第一个元素交换位置(如果第一个元素就...

  • 对于基础排序算法的简要总结

    本文主要分析排序算法中的选择排序、插入排序、希尔排序、归并排序、快速排序和堆排序,以及其部分优化方式,部分代码示例...

  • 冒泡排序及其简单优化

    冒泡排序是最基础的排序算法,每一轮的冒泡都是把最小的或者最大的冒到一端,是一种稳定的排序算法,时间复杂度为O(n^...

  • 数据结构—排序问题:冒泡、选择、插入、归并、快排、计数、基数(桶

    缺失:希尔排序、堆排序优化:快速排序 待补充状态 导读 简单算法:冒泡排序O(n2)、简单选择排序O(n2)、直接...

  • 冒泡排序及其优化算法(C#)

    算法的稳定性: 通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。即假...

  • 常见排序算法(2)--简单选择排序

    简单选择排序也比较简单,不过效率比前面的未优化版的冒泡排序会略微高一些,下面我们看看简单选择排序的代码吧。 其实简...

  • 插入排序及其简单优化

    插入排序是稳定的排序方法,时间复杂度是O(n^2)最坏情况(完全逆序的情况)O(n^2), 最好情况(完全顺序的情...

网友评论

    本文标题:简单选择排序及其优化(C#)

    本文链接:https://www.haomeiwen.com/subject/elwgchtx.html