常见排序算法-选择排序

Posted 咸鱼成长小站

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常见排序算法-选择排序相关的知识,希望对你有一定的参考价值。

上次我们详细的描述了一下冒泡排序的原理与写法。最后还对其最优情况进行了优化,使它最优情况下有O(n)的时间复杂度。

今天我们来介绍第二种排序算————选择排序。

相对于冒泡排序,选择排序更加的简单,也更加的易懂,它的排序过程就是在第i趟排序中,先遍历一遍待排序的数组,然后找出其中最小的一个,将它的位置和第i个交换。也就是说,一个数组包含n个元素,排序的过程就是在第i到n个元素中(i = 1,2,..,n-1),找到最小的一个,放到第i位。

依旧举个栗子:

我们有一个未排序数组:[8,7,6,9,5,4,2,1,3]

第一趟排序

我们首先将第一位下标记位min,然后遍历这个数组,寻找最小的下标。

很显然,最小值为下标为7的1。我们将其与第一位交换,数组就变为

[1,7,6,9,5,4,2,8,3]

第二趟排序

我们这一次只需要遍历第2至9位。因为第一位已经是有序的了。

第二次遍历得到最小值的下标为6。将其与第二位交换,结果变成

[1,2,6,9,5,4,7,8,3]

之后的排序过程与之前的相似,这儿就不再赘述了。

我们最多需要经过 n-1 次排序,就可以将一个无序数组转变为有序数组。

那么它的时间复杂度是多少呢?

我们至多要进行 n-1 次排序,因此外层循环需要执行 n-1 次。

而每一次循环,我们所需要执行的比较次数不一样,分别为 n-1次,n-2次,n-3次…1次

所以我们的时间复杂度就为O(n-1+n-2+…+2+1 = n*(n-1)/2)

最终得到的是一个 O(n^2) 时间复杂度。和冒泡排序是一样的。

但是和冒泡排序不同的点就是选择排序所需要进行的交换次数少,所以尽管两种排序都是O(n^2)的时间复杂度,但选择排序性能还是比冒泡要略优一点。

下面是选择排序的代码样例

 1#include <iostream>
2template <typename T>
3void SelectSort(T *arr,int n){
4    for(int i = 0;i < n;i++){
5        int curmin = i;
6        for(int j = i+1;j < n;j++){
7            if(arr[j] < arr[curmin]){
8                curmin = j;
9            }
10        }
11        if(curmin != i){
12            T temp = arr[i];
13            arr[i] = arr[curmin];
14            arr[curmin] = temp;
15        }
16    }
17}
18int main(){
19    int a[10] = {9,8,7,6,5,4,3,2,1,0};
20    SelectSort(a,10);
21    for(int i = 0;i < 10; i++){
22        std::cout<<a[i]<<" ";
23    }
24    return 0;
25}


以上是关于常见排序算法-选择排序的主要内容,如果未能解决你的问题,请参考以下文章

8大常见排序算法之选择排序!

java常见排序算法--选择排序冒泡排序插入排序分析与比较

常见排序算法

基于比较的七种常见排序算法

基于比较的七种常见排序算法

基于比较的七种常见排序算法