排序(1)———选择排序及其优化

 

一 选择排序

对于一般的选择排序,对于我们来说已经很熟悉了,代码如下:

void _sort(int a[],int n)//从小到大排序
{
    int i,j,temp;
    for(i=0;i<n-1;i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(a[i]>a[j])
            {
                temp=a[i];
                a[i]=a[j];
                a[j]=temp;
            }
        }
    }
}

这种选择排序存在缺陷,如果我输入

5

1 2 3 4 5

它实际上是不需要排序的。

那么,如何对选择排序进行改进呢?

1.不妨定义一个变量 k(标记变量),来标记本轮比较中最小的位置,假设初始元素a[i]最小,将其下标作为标记变量的初始值 k = i。

2.然后让后面的所有元素 a[i] 分别与 a[k] (最小值)作比较,如果比 a[k] 还小,只需要将最小值下标 j 赋给变量k即可。

3.在外循环结束后,标记的变量如果不指向初始元素(即判断i与k是否相等),说明最小值不在初始位置,这时候让初始元素与标记位置的元素进行交换即可,如果指向初始元素,则不需交换。

代码如下:

void _sort(int a[],int n)
{
    int i,j,temp,k;
    for(i=0;i<n-1;i++)
    {
        k=i;
        for(j=i+1;j<n;j++)
        {if(a[k]>a[j])
               k=j;
        }
        if(i!=k)
        {
            temp=a[i];
            a[i]=a[k];
            a[k]=temp;
        }
    }
}
posted @ 2020-01-13 21:26  Maple1234  阅读(197)  评论(0编辑  收藏  举报