刷题——二元选择排序

来源:互联网 发布:电脑nfc读写软件 编辑:程序博客网 时间:2024/06/11 17:35

问题及代码:

/*问题描述:二元选择排序:对传统的选择排序算法改进,在一趟比较过程中,同时记录最大值和最小值位置,将最小值与第一个元素交换,最大值与最后一个元素交换,即一趟比较确定两个元素,对剩下的序列重复上述过程,直至序列为空。*/#include<iostream>using namespace std;int main(){    int a[100],i,n;    cin>>n;    for(i=0; i<n; i++)        cin>> a[i];    int j , minpos ,maxpos, tmp;    for (i=0 ; i <n/2; i++)//记录一共要比较的趟数,即为n/2    {        minpos = i;        maxpos = i ;        for (j= i+1; j<= n-i-1; j++)//以下的两个循环是用来找出做大值和最小值的下标的,也就是从数组中的第二个数和倒数第二个数开始往中间比较的        {            if (a[j] > a[maxpos])            {                maxpos = j ;                continue ;            }            if (a[j]< a[minpos])                minpos = j ;        }        tmp = a[i];//此时的最小值已经赋值给了a[i],也就是说此时的第一个数应为存放的是最小值,        a[i] = a[minpos];        a[minpos] = tmp;        if(maxpos==i)//存在一种情况就是若第一个数是最大的数的话,那么程序后面就有少考虑的情况,所以要设置一个第一个数与找出的数的下标进行比较的处理(此时的处理原理就是若最大的数的下标就是你本应该存放最小数的下标,那就要交换)        {            tmp = a[n-i-1];            a[n-i-1] = a[minpos];            a[minpos] = tmp;        }        else//还有还有就是如果不符合之前的比较的话,那么就是直接把最大的放到最后的位置        {            tmp = a[n-i-1];            a[n-i-1] = a[maxpos];            a[maxpos] = tmp;        }    }    for(i = 0; i<n; i++)        cout<<a[i]<<" ";    cout<<endl;    return 0;}


运行结果:

心得体会:刚开始做这道题的时候几乎完全没有思路。后来慢慢改,但还是存在问题,于是想到是不是在中间要求修改的部分增加一些判断的条件,但是还是不行,一直是有些数据无法进行交换位置,后来童宇童鞋给修改也是不行,无助之下求助贺老,在贺老的解释下才明白是什么意思,就是代码中注释的部分

0 0
原创粉丝点击