• 排序算法之选择排序


    基本思想

       在要排序的一组数中,选出最小(或者最大)的一个数与第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;
    }
  • 相关阅读:
    数据查询语句
    数据操作语句
    数据定义语句
    linux的常用命令
    NIO/IO/AIO阻塞/非阻塞/同步/异步
    XCode使用自带SVN,SVN命令
    正则表达式大全——持续更新中。。。
    sql语句优化
    sql一些语句性能及开销优化
    高质量图片无损压缩算法
  • 原文地址:https://www.cnblogs.com/chmm/p/7427389.html
Copyright © 2020-2023  润新知