zoukankan      html  css  js  c++  java
  • 排序算法之选择排序

    基本思想

       在要排序的一组数中,选出最小(或者最大)的一个数与第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;
    }
  • 相关阅读:
    unix/linux中图形界面那些事
    vmware虚拟机工具vmware tools介绍及安装排错
    debian软件源source.list文件格式说明
    Python 基础学习 总结篇
    Git 学习(八)其他
    Git 学习(七)标签管理
    Git 学习(六)分支管理
    Git 学习(五)远程仓库
    Git 学习(四)操作修改和版本穿梭
    页面元素定位 XPath 简介
  • 原文地址:https://www.cnblogs.com/chmm/p/7427389.html
Copyright © 2011-2022 走看看