排序演算法-簡單選擇排序
阿新 • • 發佈:2021-01-25
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;
}