zoukankan      html  css  js  c++  java
  • 简析选择排序

    参考:百度百科-选择排序(Selection sort)
     

    算法原理:

    1. n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。
    2. 初始状态:无序区为R[1...R], 有序区为空
    3. 第1趟 选择最小的R[k]元素,使其与R[1]交换。此时有序区增加1,为R[1...1]; 无序区为R[2...R]。
    4. 第 i 趟走完 有序区更新为R[1...i], 无序区为R[i+1...R]。

    排序流程图:

    算法分析:

    时间复杂度:O(n2)
    交换次数比冒泡排序少,所以更快
    不稳定排序算法

    算法实现:

    1. C语言版本:

    #include "stdio.h"
    #include "stdlib.h"
    
    /*
    1. n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。
    2. 初始状态:无序区为R[1...R], 有序区为空
    3. 第1趟 选择最小的R[k]元素,使其与R[1]交换。此时有序区增加1,为R[1...1]; 无序区为R[2...R]。
    4. 第 i 趟走完 有序区更新为R[1...i], 无序区为R[i+1...R]。
    */
    
    void selectSwap(int arr[], int j, int min)
    {
        int tmp = arr[j];
        arr[j] = arr[min];
        arr[min] = tmp;
    }
    
    //选择排序主循环
    void selectSort(int arr[], int len)
    {
        int min = 0;
        for (int i = 0; i < len - 1; i++){
            min = i;
            for (int j = i + 1; j < len; j++){
                if (arr[j] < arr[min]){
                    selectSwap(arr, j, min);
                }
            }
        }
    }
    
    //打印数组元素
    void printSelect(int arr[], int len){
        for (int i = 0; i<len; i++)
            printf("%d	", arr[i]);
        printf("
    ");
    }
    
    int main()
    {
        int arr[10] = { 3, 5, 1, -7, 4, 9, -6, 8, 10, 4 };
        int arrLen = sizeof(arr) / sizeof(arr[0]);
        //打印原数组
        printSelect(arr, arrLen);
        //执行选择排序
        selectSort(arr, arrLen);
        //打印排序后的数组
        printSelect(arr, arrLen);
    
        //暂停终端窗口
        system("pause");
        return 0;
    }

    2. C++版本:

    #include "iostream"
    #include "cstdlib"
    
    using namespace std;
    
    /*
    1. n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。
    2. 初始状态:无序区为R[1...R], 有序区为空
    3. 第1趟 选择最小的R[k]元素,使其与R[1]交换。此时有序区增加1,为R[1...1]; 无序区为R[2...R]。
    4. 第 i 趟走完 有序区更新为R[1...i], 无序区为R[i+1...R]。
    */
    
    template<typename T> void selectSwap(T arr[], int j, int min)
    {
        T tmp = arr[j];
        arr[j] = arr[min];
        arr[min] = tmp;
    }
    
    //选择排序主循环
    template<typename T> void selectSort(T arr[], int len)
    {
        int min = 0;
        for (int i = 0; i < len - 1; i++){
            min = i;
            for (int j = i + 1; j < len; j++){
                if (arr[j] < arr[min]){
                    selectSwap(arr, j, min);
                }
            }
        }
    }
    
    //打印数组元素
    template<typename T> void printSelect(T arr[], int len){
        for (int i = 0; i<len; i++)
            cout << arr[i] << ' ';
        cout << endl;
    }
    
    int main()
    {
        //整型排序
        int arr[10] = { 3, 5, 1, -7, 4, 9, -6, 8, 10, 4 };
        int arrLen = sizeof(arr) / sizeof(arr[0]);
        //打印原数组
        printSelect(arr, arrLen);
        //执行选择排序
        selectSort(arr, arrLen);
        //打印排序后的数组
        printSelect(arr, arrLen);
    
        //浮点型排序
        double arrf[] = { 17.5, 19.1, 0.6, 1.9, -10.5, 12.4, 3.8, 19.7, 1.5, 25.4, 28.6, 4.4, 23.8, 5.4 };
        arrLen = sizeof(arrf) / sizeof(arrf[0]);
        //打印原数组
        printSelect(arrf, arrLen);
        //执行选择排序
        selectSort(arrf, arrLen);
        //打印排序后的数组
        printSelect(arrf, arrLen);
    
        //暂停终端窗口
        system("pause");
        return 0;
    }
     
     
     
  • 相关阅读:
    教育行业漏洞报告平台(Beta)数据爬取分析
    对三国演义人物出现次数统计分析
    用turtle画一个雪人
    python慕课笔记
    浮动的特性
    传统网页布局的三种方式
    CSS盒子阴影
    HTTP协议
    盒子 圆角边框
    Tomcat+Idea项目的发布、war包的导出
  • 原文地址:https://www.cnblogs.com/cai1432452416/p/11046951.html
Copyright © 2011-2022 走看看