算法描述
选择排序:比如在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换……第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成。
时间复杂度: O(n^2)
空间复杂度: O(1)
稳定性: 不稳定 (比如序列【5, 5, 3】第一趟就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)
直接贴Code:
#include <iostream>
#include <vector>
#include <time.h>
#include <fstream>
using namespace std;
void ReadData(); //读取数据
vector<int> d; //数组
void SelectionSort(vector<int> &a); //选择排序
void printVector(const vector<int> &a); //输出函数
int main(int argc, char *argv[])
{
clock_t start,end;
start=clock();
double totalTime;
//读入数据
ReadData();
cout<<d.size()<<endl;
SelectionSort(d);
cout<<"Sorted : " <<endl;
printVector(d);
end=clock();
totalTime=(double)(end-start)/CLOCKS_PER_SEC;
cout<<endl<<"Total Running Time : "<<totalTime<<endl;
cout<<d.size();
system("pause");
return 0;
}
void ReadData()
{
extern vector<int> d;
int ele;
fstream InFile("E:/QT/SelectionSort/data.txt");
while (!InFile.eof())
{
InFile>>ele;
d.push_back(ele);
}
d.pop_back();
}
void swap_ele(int *p1, int *p2)
{
int temp(0);
temp=*p1;
*p1=*p2;
*p2=temp;
}
void SelectionSort(vector<int>& a)
{
int i,j,min,small=0;
for(i=0;i<a.size();i++)
{
small=a[i];
min=i; //记得初始化 最小值及最小位置
for(j=i+1;j<a.size();j++)
{
if(small>a[j])
{
small=a[j];
min=j; //记录最小数下标
}
}
if (min!=i)
swap_ele(&(a[min]),&(a[i])); //判断是否是本身,避免多余操作
}
}
void printVector(const vector<int> &a)
{
for (int i = 0; i < a.size(); i++)
{
cout << a[i] << " ";
}
cout << endl;
}