n个记录进行简单选择排序的基本方法是:通过n-i(i<=i<=n)在此关键字之间的比较,从n-i+1的记录中选出最大(小)记录,并和第i个记录进行交换,当i等于n时所有记录有序排列。
简单选择排序法在最好的情况下(已有序),不需要移动元素,次数0。在最坏情况下,前趟中,每趟移动次数为3次(两个数组元素交换值),其后不再移动元素,共进行n-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;
}