选择排序的基本思想
1.排序思想(升序):扫描整个序列,找到其中最小的一个数,将其与第一个数交换;然后,从第二个数开始向后扫描,找到最小的数与第二个数交换,往复循环n-1次,直到序列从低坐标向高坐标逐渐有序。
2.时间复杂度:o(nn)
选择排序的一种优化:两层循环法
一种改进思路:每一轮扫描中,在每次找出最小元素的基础上,再找出最大的一个元素与尾元素交换,即每一轮扫描中对两个数进行排序。该方法下,虽然时间复杂度还是o(nn),但循环扫描的次数会减半。
程序代码及验证
#include <iostream>
#include <time.h>
#include <algorithm>
using namespace std;
/*排序方法类*/
class MySort {
private:
int n;
int* A;
public:
//构造函数 ,便于挑选不同的排序方法
MySort(int N) {
this->n = N;
A = new int[this->n];
this->SetArray();
}
//随机初始化数组
void SetArray() {
srand(time(0));
for (int i = 0; i < n; i++) {
A[i] = rand() % 100 + 1;
}
}
//打印数组
void Print() {
for (int i = 0; i < n; i++) {
cout << A[i] << " ";
}
cout << endl;
}
//交换函数
void Swap(int* a, int* b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
//选择排序
void Select_Sort() {
int iminpos; //每趟循环中找出的最小值的下标
for (int i = 0; i < n-1; i++) { //循环n-1趟
iminpos = i; //默认最小值为循环首元素
for (int j = i + 1; j < n; j++) {
if (A[j] < A[iminpos]) iminpos = j; //找到最小值
}
if (iminpos != i) Swap(&A[i], &A[iminpos]);
}
}
//优化的选择排序
void Select2_Sort() {
int ileft=0, iright=n-1; //每趟排序的最左、右位置
int iminpos,imaxpos; //最小、大值的下标
while (ileft < iright) {
iminpos = ileft; //默认最小值为首元素
imaxpos = iright; //默认最大值为尾元素
for (int i = ileft; i <= iright; i++) {
if (A[i] < A[iminpos]) iminpos = i;
if (A[i] > A[imaxpos]) imaxpos = i;
}
if (iminpos != ileft) Swap(&A[ileft], &A[iminpos]);
if (imaxpos != iright) Swap(&A[iright], &A[imaxpos]);
ileft++; iright--;
}
}
};
int main(){
//初始化数组
int N;
cout << "请输入数组长度:";
cin >> N;
MySort sort(N); //构造排序方法类
cout << endl;
cout << "获得"<<N<<"位随机数组:" ;
sort.Print();
//sort.Select_Sort(); //选择排序
//cout << "选择排序后:" ;
sort.Select2_Sort(); //优化的选择排序
cout << "优化的选择排序后:";
sort.Print();
cout << endl;
return 0;
}