无情的心 发表于 2021-3-18 19:53:25

浅谈选择排序

      今天来谈谈选择排序{:10_327:},选择排序就是重复“从待排序数据中寻找最小值,将其与序列最左边的数字进行交换”
      比如有六个数{:10_256:} :6,1,7,8,9,3。第一次在这六个数中寻找出最小值,于是我们找到了1,将最小值与序列最左边的6进行交换,最小值1归位,此时序列变为1,6,7,8,9,3(见图1)。不过最小值已经在左边了,接下来就不需要任何操作了。       第二次在余下的数据中(即:6,7,8,9,3)寻找最小值,于是我们又找到了3{:10_254:}。将数字3与左边第二个数字6进行交换,最小值3归位,此时序列变为1,3,7,8,9,6。       如此进行五次排序得到1-3-6-7-8-9。


       按此规律寻找下去可以知道:对6个数需要进行5次排序,在第一次排序中需要比较5次,第二次排序中需要比较4次。
       那么对n个数进行排序:对n个数需要进行n-1次排序,在第一次排序中需要比较n-1次,在第j次排序中需要比较n-j次。

      例子(和上面稍稍不同哟{:10_335:},寻找的是最大值,并放到最后面)
#include <stdio.h>
int compare(int a[],int length);   //定义函数用来从数组中找出最大值 。
int compare(int a[],int length)
{
        int i,max=0;
        for(i=1;i<length;i++)
        {
       
                if(a>a)
                {
                        max=i;
                }
        }
        return max;               //返回最大值的序号。
}
int main()
{
        int a,i,j,temp;
        printf("please enter ten numbers:");
        for (i=0;i<10;i++)
        {
                scanf("%d",&a);
        }
        for(i=0;i<9;i++)
        {
                j=compare(a,10-i);       //将最大值的序号赋值给j。
                temp=a;            
                a=a;
                a=temp;                    //将最大值放到最后的位置
        }
        printf("the result is:");
        for(i=0;i<10;i++)
        {
                printf(" %2d ",a);
        }
        return 0;
       
       
}{:10_334:}

唉!马上就要开学了,自学编程的时间越来越少了,不过还要加油啊{:10_265:}

无情的心 发表于 2021-3-18 19:54:06

{:10_256:}

hornwong 发表于 2021-3-18 21:14:52

{:5_95:}

Minecraft程序猿 发表于 2021-3-18 21:49:19

不是开学3周了吗

无情的心 发表于 2021-3-18 21:52:36

Minecraft程序猿 发表于 2021-3-18 21:49
不是开学3周了吗

河北还没开学,在家网课

Minecraft程序猿 发表于 2021-3-18 21:53:35

无情的心 发表于 2021-3-18 21:52
河北还没开学,在家网课

哦,山东的初中早开学了...呜呜...
页: [1]
查看完整版本: 浅谈选择排序