选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
伪代码:
for(int i=0;i<n;i++)
{
int temp = i;
for(int j = index;j<n;j++)
{
if(a[temp]>a[j])
{
temp = j;
}
}
swap(a[temp],a[i]);
index++;
}
写一个程序,将1~10从大到小排序:
#include<iostream>
using namespace std;
void swap(int* a, int* b)
{
int temp=*a;
*a=*b;
*b=temp;
}
void paixu(int *arr,int n) {
int *min;
for (int *i=arr;i<arr+n-1;i++)
{
min = i;
for(int *j=i+1;j<arr+n;j++)
{
if(*j>*min)
{
min=j;
}
}
if(min!=i)
{
swap(i,min);
}
}
}
void print(int *arr,int n)
{
for (int *i=arr;i<arr+n;i++)
{
cout<<*i<<" ";
}
cout<<endl;
}
int main() {
int arr[10];
int n=10;
for (int *i=arr;i<arr+n;i++)
{
cin>>*i;
}
cout << endl;
paixu(arr, n);
print(arr, n);
return 0;
}
选择排序的核心思想即是在一个范围里(为排序的)找出最小或者最大的值,与范围的起始值进行交换,进行n-1次,从而排序完整个集合。
选择排序的时间复杂度:由于需要排序n-1次,每一趟又需要遍历m个元素,所以选择排序的时间复杂度即为O(n2)。
比赛时,只能适合10000以内的数据,如果超出了这个数据,很可能会超时。
这里有一个技巧,就是在比赛的时候,可以避免使用cin、cout,而使用c语言中的printf、scanf,后者是比前者快很多的,当然前者也可以通过其他代码进行优化,但如果记不住,可以直接用C语言的输入输出,以提高通告的概率。
什么叫算法的稳定性:算法稳定性指的是在一组待排序记录中,如果存在任意两个相等的记录R和S,且在待排序记录中R在S前,如果在排序后R依然在S前,即它们的前后位置在排序前后不发生改变,则称为排序算法为稳定的。
为什么选择排序是不稳定的?举个特例{10,8,10,4},这四个值第一个10我们标记为A10,第二个10我们标记为B20,在第一次排序过程后序列变为{4,8,10,10},A10去了B10后面,和原来的相对位置不一样了,所以选择排序是不稳定的。
最后,大家可以看看这篇文章:
我是IDiostream,希望下次与你相遇!