选择排序法

1. 算法思路

冒泡法的每一趟,都通过两两互换,把最大值冒到了序列尾部。由于程序中赋值语句消耗的时间是最多的,这种每次两两互换消耗了不少的时间。

所以引入选择排序法,和冒泡法一样,都是每一趟找出最大值(或最小值),然而并不是通过两两互换的方式,而是把临时最大值所在的位置记录在一个变量中,然后剩余的元素依次和这个临时最大值比较:

你比我大,那临时最大值的位置就交给你;你没我大,那就下一个再和我比。

这样一趟后,我们就知道了最大值的位置。然后,将最大值元素和尾部元素互换(也可以最小值和首部元素互换),这样一趟一下只用互换一次。最后,进行length-1趟后,就排序成功啦。

2. 核心代码

int selectionSort(int *data, unsigned int length)
{
    if (data == NULL)
    {
        return -1;
    }

    //遍历
    for (int traverse_i = 0; traverse_i < length-1; traverse_i++)//只需把前length-1个最小值放在数组前面就排序成功了
    {
        //比较得出目前最小值所在的位置
        int minDataNum = traverse_i;
        for (int compare_j = traverse_i+1; compare_j < length; compare_j++)
            if (data[compare_j]<data[minDataNum])
                minDataNum = compare_j;

        //和数组开头交换
        if (minDataNum!=traverse_i)
        {
            int temp;
            temp = data[minDataNum];
            data[minDataNum] = data[traverse_i];
            data[traverse_i] = temp;
        }
    }


    return 0;
}

3. Test程序

#include<iostream>
#include<string>
using namespace std;
int selectionSort(int *data, unsigned int length);

void main(void)
{
    int array[10] = {9,8,7,6,5,4,3,2,1,0};
    int num = 10;

    //step1: 遍历数组,输出初始排列
    for (int arN = 0; arN < num; arN++)
    {
        cout << array[arN]<<' ';
    }
    cout << endl;

    //step2: 插入排序
    selectionSort(array, num);

    //step3: 遍历数组,输出排序后结果
    for (int arN = 0; arN < num; arN++)
    {
        cout << array[arN]<<' ';
    }
}

int selectionSort(int *data, unsigned int length)
{
    if (data == NULL)
    {
        return -1;
    }

    //遍历
    for (int traverse_i = 0; traverse_i < length-1; traverse_i++)//只需把前length-1个最小值放在数组前面就排序成功了
    {
        //比较得出目前最小值所在的位置
        int minDataNum = traverse_i;
        for (int compare_j = traverse_i+1; compare_j < length; compare_j++)
            if (data[compare_j]<data[minDataNum])
                minDataNum = compare_j;

        //和数组开头交换
        if (minDataNum!=traverse_i)
        {
            int temp;
            temp = data[minDataNum];
            data[minDataNum] = data[traverse_i];
            data[traverse_i] = temp;
        }
    }


    return 0;
}

运行结果:
选择排序法_第1张图片

你可能感兴趣的:(排序算法,选择排序法)