zoukankan      html  css  js  c++  java
  • 查找与排序03,选择排序

    选择排序是一种低效的排序算法,大致过程是:遍历数组的每一个元素,先假设0号位置上的元素是最小的,并把0号索引赋值给一个表示最小元素索引的变量,比如说是smallest,再遍历0号位置以后的元素,一旦发现有比0号位置元素更小的元素,就把该元素的索引赋值给smallest,继续遍历,最终把0号位置以后最小元素的索引赋值给了smallest变量,再把0号位置和smallest位置上的元素互换,这样,在0号位置上放上了最小元素。接着,在1号位置放上倒数第二小的元素,在2号位置放上倒数第三小的元素......以此类推,最终得到一个升序排列的数组。由于是依次循环遍历数组元素,个人更愿意把选择排序理解成线性排序。

    自定义一个类,里面维护着一个int[]类型数组,通过构造函数定义数组长度并初始化,并提供了打印和选择排序的相关方法。

       public class MyArray
    
        {
    
            private static int[] arr;
    
            private static Random r = new Random();
    
            public MyArray(int size)
    
            {
    
                arr = new int[size];
    
                for (int i = 0; i < size; i++)
    
                {
    
                    arr[i] = r.Next(1, 100);
    
                }
    
            }
    
            //选择排序算法
    
            public void Sort()
    
            {
    
                int smallest; //最小元素的索引 
    
                //最后一个索引位置不需要遍历,因为在代码段的内部循环中包含了对最后一个索引位置的处理
    
                for (int i = 0; i < arr.Length - 1; i++)
    
                {
    
                    //把当前遍历的元素的索引赋值给smallest,即假设当前遍历的数组元素为最小元素
    
                    smallest = i;
    
                    //遍历当前遍历元素后面的所有元素
    
                    //获取最小元素的索引
    
                    for (int index = i + 1; index < arr.Length; index++)
    
                    {
    
                        if (arr[index] < arr[smallest])
    
                        {
    
                            smallest = index;
    
                        }
    
                    }
    
                    //把当前遍历元素和最小元素交换位置
    
                    Swap(i, smallest);
    
                    //每次排完序打印
    
                    Print();
    
                }
    
            }
    
            //交换2个位置上的元素
    
            public void Swap(int first, int second)
    
            {
    
                int temp = arr[first];
    
                arr[first] = arr[second];
    
                arr[second] = temp;
    
            }
    
            //打印数组元素
    
            public void Print()
    
            {
    
                foreach (var item in arr)
    
                {
    
                    Console.Write(item + " ");               
    
                }
    
                Console.WriteLine("
    ");
    
            }
    
        }
    

    客户端调用。

        class Program
    
        {
    
            static void Main(string[] args)
    
            {
    
                MyArray myArray = new MyArray(8);
    
                Console.Write("排序前: ");
    
                myArray.Print();
    
                Console.WriteLine("排序后: ");
    
                myArray.Sort();
    
                Console.ReadKey();
    
            }
    
        }
    

    1

    可见,对选择排序来说,外部循环进行了n-1次迭代,内部循环第一次进行了n-1迭代,第二次进行了n-2次迭代……以时间复杂度来说,忽略小项和常数项,选择排序基本上是一个平方阶,写成O(n²)。

    “查找与排序”系列包括:

    查找与排序01,线性查找,时间复杂度,算法

    查找与排序02,折半查找

    查找与排序03,选择排序

    查找与排序04,插入排序

    查找与排序05,冒泡排序

  • 相关阅读:
    UVa 11538 Chess Queen (排列组合计数)
    CodeForces 730H Delete Them (暴力)
    CodeForces 730G Car Repair Shop (暴力)
    汇编(assembling)简介(源:阮一峰)
    CSS骚操作
    Jquery复习总结
    CGI与ISAPI的区别(转)
    SQL中Group By的使用(转)
    05 ADO.net
    04 SqlServer
  • 原文地址:https://www.cnblogs.com/darrenji/p/3874778.html
Copyright © 2011-2022 走看看