排序算法之选择排序

基本思想

   在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。

代码实现

#include<iostream>
using namespace std;

/*指定查找范围找出最小值*/
int SelectMinKey(int a[], int n, int i)
{
    int k = i;
    for (int j = i + 1; j< n; ++j) {
        if (a[k] > a[j]) k = j;
    }
    return k;
}

void selectSort(int a[], int n) {
    int key, tmp;
    for (int i = 0; i< n; ++i) 
    {
        key = SelectMinKey(a, n, i); //选择最小的元素  
        if (key != i) 
        {
            tmp = a[i]; 
            a[i] = a[key]; 
            a[key] = tmp; //最小元素与第i位置元素互换  
        }
    }
}

int main() {
    int a[8] = { 3,1,5,7,2,4,9,6 };
    selectSort(a, 8);
    for (auto c : a)
    {
        cout << c << " ";
    }
    cout << endl;
}

算法改进:可以一次搜索中同时找出最大值与最小值,能够提高算法的效率

#include<iostream>
using namespace std;

void swap(int *a, int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

void SelectSort(int r[], int n) 
{
    int min, max, count = 0;
    for (int i = 1; i <= n / 2; i++) 
    {
        min = count;
        max = count;
        for (int j = count; j < n - count; ++j)
        {
            /*查找最大值的索引*/
            if (r[j] > r[max])
            {
                max = j;
            }
            /*查找最小值索引*/
            if (r[j] <r[min])
            {
                min = j;
            }
        }

        swap(r[max], r[n - count - 1]);
        if (min != n - count - 1)/*避免首尾交换两次*/
        {
            swap(r[min], r[count]);
        }

        ++count;
    }
}

int main() {
    int a[8] = { 0,10,-1,7,100,4,9,6 };
    SelectSort(a, 8);
    for (auto c : a)
    {
        cout << c << " ";
    }
    cout << endl;
}
原文地址:https://www.cnblogs.com/chmm/p/7427389.html