八大排序总结(2)——选择排序(Selection Sort)(c语言实现)

>>>八大排序总结(1)——冒泡排序(Bubble Sort)(c语言实现)<<<

>>>八大排序总结(3)——插入排序(Insertion Sort)(c语言实现)<<<

>>>八大排序总结(4)——快速排序(Quick Sort)(c语言实现)<<<

>>>八大排序总结(5)——归并排序(Merge Sort)(c语言实现)<<<

>>>八大排序总结(6)——希尔排序(Shell Sort)(c语言实现)<<<

>>> 八大排序总结(7)——堆排序(Bubble Sort)(c语言实现)<<<

>>>八大排序总结(8)——线性时间复杂度的排序(桶排序,基数排序,计数排序)【用空间换时间】(c语言实现)<<<

>>>八大排序 时间复杂度,空间复杂度,稳定性的比较<<<


目录

选择排序(Selection Sort)基本思想

原理

时间,空间复杂度与算法稳定性 

代码+分析


选择排序(Selection Sort)基本思想

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。


原理

八大排序总结(2)——选择排序(Selection Sort)(c语言实现)_第1张图片

如图所示,有一个有n个数无序序列,第一次将这个无序序列中的最小值1放到最前面,这样1本身就可以看作是一个有序序列。第二次把剩余的无序序列中最小的元素放到有序序列的后面,也就是把2放到1的后面,就这样一直循环,循环n-1轮后,这个序列就是有序的了。


时间,空间复杂度与算法稳定性 

1.时间复杂度:选择排序的复杂度分析。第一次内循环比较N - 1次,然后是N-2次,N-3次,……,最后一次内循环比较1次。共比较的次数是 (N-1)+(N-2)+......+2+1 =N*(N-1)/2 次,所以其时间复杂度为O(N^{2})

虽然选择排序和冒泡排序的时间复杂度一样,但实际上,选择排序进行的交换操作很少,最多会发生 N - 1次交换。而冒泡排序最坏的情况下要发生N^2 /2交换操作。由于交换所需CPU时间比比较所需的CPU时间多,从这个意义上讲,选择排序的性能略优于冒泡排序,而且N的值越小,差别就越明显。

2.空间复杂度:O(1)

3.稳定性:稳定(稳定性的含义可参考https://blog.csdn.net/qq_24016309)

选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。比较拗口,举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。


代码+分析

void selection_sort(int arr[],int n)
{
    int i,j,k,temp;
    for (i = 0; i < n - 1; i++)
    {
        k = i;
        for (j = i + 1; j < n; j++)
        {
            if (arr[j] < arr[k])
            {
                k = j;    /*记录最小值下标位置*/
            }
        }
        if (k != i)  /*若最小数所在的下标位置不在位置i则进行交换*/
        {
            temp = arr[k];
            arr[k] = arr[i];
            arr[i] = temp;
        }
    }
}

欢迎大家评论指正,谢谢◕‿◕

你可能感兴趣的:(八大排序算法总结)