首页 > 编程语言 > 详细

简析选择排序

时间:2019-06-18 20:09:34      阅读:194      评论:0      收藏:0      [点我收藏+]
参考:百度百科-选择排序(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\t", arr[i]);
    printf("\n");
}

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!