常用排序算法归纳(3)——选择排序

一、概念:

    每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。选择排序是非稳定排序算法。

二、算法思路

    1、先设定一个变量,并且把所需排列的数据中第一个的值赋给该变量;

    2、将该变量与剩下数据挨个进行比较,选出最小(或最大)的一个值,与  第一个数据交换位置;

    3、然后把第二个数据的值赋给变量,将该变量与剩下的数据进行比较,选出最小(或最大)的值,与第二个数据交换位置;

    4、重复进行上述操作,直至最后一个数据,排序结束。


三、优缺点:

    优点:主要与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。

    缺点:与其他排序方法相比较,相对还是慢。


四、代码实现:

#include <stdio.h>

void my_printf(int *v , int n)   //输出数据
{
    int i;
    for(i = 0 ; i < n ; i ++)
    {
        printf("%d  ", v[i]);
    }
    printf("\n");
}

void choose(int *v , int n)
{
    int i;
    int j;
    int tmp;      //记录最小数的下标
    int total;    //与所需排列数据挨个进行比较的变量

    for(i = 0 ; i < n ; i ++)
    {
        total = v[i];
        tmp = i;

        for(j = i ; j < n ; j ++)
        {
            if(v[j] < total)
            {
                total = v[j];
                tmp = j;
            }
        }
        v[tmp] = v[i];
        v[i] = total;
    }
}

int main()
{
    int a[] = {5 , 9 , 1 , 7 , 3 , 2 , 6 , 8 , 4};
    my_printf(a , (sizeof(a)/sizeof(a[0])));
    choose(a , (sizeof(a)/sizeof(a[0])));
    my_printf(a , (sizeof(a)/sizeof(a[0])));

    return 0;
}

运行结果:


五、复杂度:

    时间复杂度:O(n );

    空间复杂度:O(1)。


猜你喜欢

转载自blog.csdn.net/buknow/article/details/80486948