排序算法-简单选择排序

n个记录进行简单选择排序的基本方法是:通过n-i(i<=i<=n)在此关键字之间的比较,从n-i+1的记录中选出最大(小)记录,并和第i个记录进行交换,当i等于n时所有记录有序排列。

简单选择排序法在最好的情况下(已有序),不需要移动元素,次数0。在最坏情况下,前\frac{n}{2}趟中,每趟移动次数为3次(两个数组元素交换值),其后不再移动元素,共进行n-1趟排序,总移动次数为3(n-1)/2

总比较次数为 \sum_{i=1}^{n-1}(n-i) = \frac{n(n-1)}{2}

简单选择排序是一种不稳定的排序方法,其时间复杂度为O(n^{^{2}})。空间复杂度为O(1)

//  非递减有序排序
void selectsort_ASC(vector<int> &data)
{
    int size = data.size();     //  数据个数
    for(int i = 0; i < size - 1; i++)
    {
       int k = i;  // 未排序中的最小的数下标
       for(int j = i + 1; j < size; j++) // i之前的数是排好序
       {
           if(data.at(j) < data.at(k)) // 发现更小的数
           {
               k = j;
           }
       }

       if(k != i) // i不是最小的数,则交换
       {
           swapNum(data.at(i), data.at(k));
       }
    }
}
//  非递增有序排序
void selectsort_DESC(vector<int> &data)
{
    int size = data.size();     //  数据个数
    for(int i = 0; i < size - 1; i++)
    {
       int k = i;  // 未排序中的最大的数下标
       for(int j = i + 1; j < size; j++) // i之前的数是排好序
       {
           if(data.at(j) > data.at(k)) // 发现更大的数
           {
               k = j;
           }
       }

       if(k != i) // i不是最大的数,则交换
       {
           swapNum(data.at(i), data.at(k));
       }
    }
}
//  排序,合并成一个函数, bASC
// true : 非递减有序排序
// false:  非递增有序排序
void selectsort(vector<int> &data, const bool &bASC)
{
    int size = data.size();     //  数据个数
    for(int i = 0; i < size - 1; i++)
    {
       int k = i;  // 未排序中的最大(小)的数下标
       for(int j = i + 1; j < size; j++) // i之前的数是排好序
       {
           // true : 非递减有序排序
           // false:  非递增有序排序
           bool nRet = bASC ? data.at(j) < data.at(k) : data.at(j) > data.at(k);
           if(nRet) // 发现更大(小)的数
           {
               k = j;
           }
       }

       if(k != i) // i不是最大(小)的数,则交换
       {
           swapNum(data.at(i), data.at(k));
       }
    }
}

总:

#include <iostream>
#include <vector>
#include <stdlib.h>
#include <time.h>
using namespace std;

// 交换数值
void swapNum(int &a, int &b)
{
    int tmp = a;
    a       = b;
    b       =  tmp;
}

//  非递减有序排序
void selectsort_ASC(vector<int> &data)
{
    int size = data.size();     //  数据个数
    for(int i = 0; i < size - 1; i++)
    {
       int k = i;  // 未排序中的最小的数下标
       for(int j = i + 1; j < size; j++) // i之前的数是排好序
       {
           if(data.at(j) < data.at(k)) // 发现更小的数
           {
               k = j;
           }
       }

       if(k != i) // i不是最小的数,则交换
       {
           swapNum(data.at(i), data.at(k));
       }
    }
}

//  非递增有序排序
void selectsort_DESC(vector<int> &data)
{
    int size = data.size();     //  数据个数
    for(int i = 0; i < size - 1; i++)
    {
       int k = i;  // 未排序中的最大的数下标
       for(int j = i + 1; j < size; j++) // i之前的数是排好序
       {
           if(data.at(j) > data.at(k)) // 发现更大的数
           {
               k = j;
           }
       }

       if(k != i) // i不是最大的数,则交换
       {
           swapNum(data.at(i), data.at(k));
       }
    }
}

//  排序,合并成一个函数, bASC
// true : 非递减有序排序
// false:  非递增有序排序
void selectsort(vector<int> &data, const bool &bASC)
{
    int size = data.size();     //  数据个数
    for(int i = 0; i < size - 1; i++)
    {
       int k = i;  // 未排序中的最大(小)的数下标
       for(int j = i + 1; j < size; j++) // i之前的数是排好序
       {
           // true : 非递减有序排序
           // false:  非递增有序排序
           bool nRet = bASC ? data.at(j) < data.at(k) : data.at(j) > data.at(k);
           if(nRet) // 发现更大(小)的数
           {
               k = j;
           }
       }

       if(k != i) // i不是最大(小)的数,则交换
       {
           swapNum(data.at(i), data.at(k));
       }
    }
}

//  在控制台打印
void dadaCout(const vector<int> &data)
{
    int size = data.size();
    for(int i = 0; i < size; i++)
    {
        cout << data.at(i) << " " ;
    }

    cout << endl;
}

int main()
{
    srand((unsigned)time(NULL));        //随机数种子

    vector<int> data;
    for(int i = 0; i < 15; i++)
    {
        // 获取两位数的随机数
        data.push_back(rand() % 90 + 10);
    }

    // 打印原始数据
    cout << "data:                   ";
    dadaCout(data);

    // 非递减有序排序
    selectsort_ASC(data);
    cout << "selectsort_ASC:         ";
    dadaCout(data);

    // 非递增有序排序
    selectsort_DESC(data);
    cout << "selectsort_DESC:        ";
    dadaCout(data);

    // 非递减有序排序
    selectsort(data, true);
    cout << "selectsort_ASC_true:    ";
    dadaCout(data);

    // 非递减有序排序
    selectsort(data, false);
    cout << "selectsort_ASC_false:   ";
    dadaCout(data);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40788199/article/details/113095966
今日推荐