选择排序法

来源:互联网 发布:三维点云数据曲面拟合 编辑:程序博客网 时间:2024/04/29 19:41

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 0
原创粉丝点击