排序算法——选择排序

在本文中可以了解到的内容有:

  • 所有排序算法对比;
  • 如何写算法程序
  • 选择算法工作原理、算法步骤、算法实现;

 

在了解选择排序前,首先对常见的排序算法有个初步认识,对比如下:

其中,最重要的为,插入排序、堆排序、归并排序、快速排序

如何写算法程序?
 
 

1 选择排序的工作原理

选择排序的工作原理是,第一次从待排序的数据元素中选出最小的一个元素存放在序列的起始位置,然后再从其余未排序的数据元素中寻找最小的元素,放到已排序的元素后,以此类推,直到全部待排序的元素个数为0。选择排序是不稳定的排序方法。
 

2 选择排序的算法步骤

  • 初始化一个数组,存放未排序的数据;
  • 定义一个指向最小元素的指针,初始化为数组第一个元素;
  • 令数据第一个元素与其他元素分别对比大小,指针移动到最小元素所在的位置,交换第一个元素和最小元素的位置;
  • 剔除排序过的n个元素,指针指向第n+1个元素,循环第二步和第三步;直到所有元素完成排序

3 选择排序的代码实现

class Program
    {
        // 选择排序:用数组中第一个元素与其他元素进行对比,当前指针移到最小的元素,将第一个元素和最小元素交换位置;
        // 选出最小元素后,剔除该元素,剩余数组循环上述过程。
        static void Main(string[] args)
        {
            int[] array = {3, 8, 4, 6, 2, 1, 5,7, 9};

            for (int i = 0; i < array.Length-1; i++)
            {
                int minIndex = i; //假设数组第一个元素为最小值
                // 找到原数组最小值
                for (int j = i+1; j < array.Length; j++)
                {
                    minIndex =  array[j] < array[minIndex] ? j : minIndex;
                }
                // 交换第一个元素arr[o]和最小值arr[minIndex]
                Swap(array, i, minIndex);

                Console.WriteLine(""+i+"次循环时,最小值对应的索引是"+minIndex);
            }

            Print(array);
        }

        // 元素交换
        private static void Swap(int[] array, int i, int j)
        {
            int temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }

        // 打印
        private static void Print(int[] array)
        {
            for (int i = 0; i < array.Length; i++)
            {
                Console.Write(array[i] + " ");
            }
        }
    }
 

4. 如何计算选择排序的时间复杂度和空间复杂度

业务的功能可以通过多种方式实现,如排序有多种方式,那么如何衡量多个算法的优劣呢?通过时间复杂度和空间复杂度进行衡量。
 
时间复杂度: 描述算法运行需要的时间,与问题规模大小有关。一般而言,计算时间复杂度时,忽略常数项和低次项。
空间复杂度:衡量一个算法在运行中需要占用的存储空间大小。
 
以上述选择排序的算法为例,计算算法的时间复杂度和空间复杂度;
一段代码中,对于无论使用哪种算法都必须执行的操作,不计算在时间复杂度和空间复杂度中。如上述排序算法的数组初始化和打印实现;

因此,整个代码执行的时间复杂度为:n^2+n,忽略低次项,最终计算结果为,O(N^2)。

 整个代码中,无论数据规模为多大,都没有增加额外的数据结构,因此空间复杂度为O(1)。

 
原文地址:https://www.cnblogs.com/mo-lu/p/13213862.html