简析选择排序

参考:百度百科-选择排序(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;
}
 
 
 
原文地址:https://www.cnblogs.com/cai1432452416/p/11046951.html