您的位置:首页 > 其它

南海石门中学第六届创新班 2015-5-16 课时总结

2016-02-15 19:34 183 查看
排序算法,是信息学奥赛中最基本的算法之一,但同时也是最重要的。这节课,老师便给我们复习了以下几种简单排序算法。选择排序 选择排序,我自认为是最直观的排序方法之一。主要算法思路是每一次都选出最小的,然后直接移动到一个序列中(序列一开始是空的),并将原来的删除。还有一个略微改进的算法,直接在主序列中寻找第i小,并把它和相应的序列中另一个位置交换(另一个位置是指,数组中的第i个元素)。 过程如下:
(以数列1 4 2 8 5 7为例)
优化前: 优化后:(主):1 4 2 8 5 7 (主):1 4 2 8 5 7(子):空
(选出第i小,此时i=1) (选出第i小,此时i=1)(主)4 2 8 5 7 (主):1 4 2 8 5 7(直接与第一个交换,这里因为第一个最小,所以看上去没有交换)(子)1
(选出第i小,此时i=2) (选出第i小,此时i=2)(主)4 8 5 7 (主):1 2 4 8 5 7(子)1 2
(选出第i小,此时i=3) (选出第i小,此时i=3)(主)8 5 7 (主):1 2 4 8 5 7(看上去没有交换,但实际上是交换了的)(子)1 2 4
(选出第i小,此时i=4) (选出第i小,此时i=4)(主)8 7 (主):1 2 4 5 8 7(子)1 2 4 5
(选出第i小,此时i=5) (选出第i小,此时i=5)(主)8 (主):1 2 4 5 7 8(子)1 2 4 5 7
(选出第i小,此时i=6) (排序结束)(主)空(子)1 2 4 5 7 8(排序结束)
下面给出选择排序的程序(已优化):
#include <iostream>
#include <algorithm>
using namespace std;

int main(){
int n;
cin>>n;
int a
;
for (int i=0;i<n;++i){
cin>>a[i];
}

int min_i;
for (int i=0;i<n;++i){
min_i=i;
for (int j=i+1;j<n;++j){
if (a[j]<a[min_i]){
min_i=j;
}
}
swap(a[i],a[min_i]);
}

for (int i=0;i<n;++i){
cout<<a[i]<<' ';
}
cout<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: