选择排序(调用,主).

7 篇文章 0 订阅

选择排序是一种简单直观的排序算法。它与冒泡排序很相似,都是比较 n-1 轮,每轮都是比较 n–1–i 次,每轮找出一个最大值或最小值。

选择排序是将每轮找出的最值放到最左边。并且在算法上,选择排序是先保存第一个元素的下标,然后后面所有的数依次与第一个元素相比,如果遇到更小的,则记录更小的那个数的下标,然后后面所有的数都依次与那个更小的数比较,直到最后将最小的数的下标找出来,然后再将这个数放到最左边,即与下标为 0 的数互换。如果最小的数的下标就是 0 那么就不用互换。

所以,选择排序算法是先判断最小的数的下标是不是 0,如果不是则说明最小的数不是第一个元素,则将这个数与第一个元素互换位置,这样一轮下来最小的那个数就被找到并放到了最左边。

在第二轮同样先保存新序列第二个元素的下标,后面所有的数依次与第二个元素相比较,如果遇到更小的则记录更小的那个数的下标,然后后面所有的数都依次与那个更小的数比较,直到最后又找到一个最小的,此时这个最小的在整个序列中是“第二小”。然后再判断这个数的下标是否等于 1,如果不等于 1 说明“第二小”的那个数不是第二个元素,则将这个数与第二个元素互换位置,这样第二轮下来就找到了“第二小”的那个数,并将它放到了第二个位置。如此循环,直到整个序列实现从小到大排序。

如果是从大到小排序,那么就记录大的那个数的下标,每一轮找出一个最大的数放到左边。

从上面的分析可以看出,选择排序是比较一轮才互换一次,而且如果本轮中最小的就是最左边那个数则不用互换。选择排序效率高。

下面一个程序,用选择排序实现一个序列的从小到大排序:

#include<stdio.h>
int Zz(int n)
{
    int i,j;
    int t,MinIndex;
    int a[]={6,48,25,19,76,96};
    for(i=0;i<n-1;++i)
        {
           MinIndex=i;
           for(j=i+1;j<n;++j) 
              {
                if(a[MinIndex]>a[j])
                   {
                     MinIndex=j;
                    }
               }
         if(MinIndex!=i)
           {
            t=a[MinIndex];
            a[MinIndex]=a[i];
            a[i]=t;
           }
    }
    printf("最后排序结果为:\n");
   for(i=0;i<n;i++)
      {
       printf("%d ",a[i]);
      }
    return a[i];
}
int main()
{
	Zz(6);
	return 0;
}

​
#include<stdio.h>
int main()
{
    int i,j;
    int t,MinIndex;
    int a[]={6,48,25,19,76,96};
    for(i=0;i<6-1;++i)
        {
           MinIndex=i;
           for(j=i+1;j<6;++j) 
              {
                if(a[MinIndex]>a[j])
                   {
                     MinIndex=j;
                    }
               }
         if(MinIndex!=i)
           {
            t=a[MinIndex];
            a[MinIndex]=a[i];
            a[i]=t;
           }
    }
   for(i=0;i<6;i++)
      {
       printf("%d ",a[i]);
      }
    return 0;
}
//选择排序,从大到小顺序降序后输出//
#include<stdio.h>
int main()
{
	int i,j,t,MaxIndex;
	int a[]={12,23,45,53,13,76,98,78,54,72};
	int n=(sizeof(a)/sizeof(a[0]));
	for(i=0;i<n;i++) {
		printf("%d ",a[i]);
	}
	for(i=0;i<n-1;++i) {
		MaxIndex=i;
		for(j=i+1;j<n;++j) {
			if(a[MaxIndex]<a[j]) {
			   MaxIndex=j;
		    }
	    } 
		if(a[MaxIndex]!=i) {
			t=a[MaxIndex];
			a[MaxIndex]=a[i];
			a[i]=t;
		}
	}	
	printf("\n最后输出结果为:\n");
	for(i=0;i<n;i++) {
	    printf("%d ",a[i]);
	}
	return 0;	 
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四维空间中的未知点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值