选择排序(C++实现)

16 篇文章 0 订阅

二、选择排序(O(n^2)、不稳定)
  每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置(或末尾位置),直到全部待排序的数据元素排完。

选择排序不稳定的原因:

       选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,
       依次类推,直到第n-1个元素,第n个 元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,
       如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么 交换后稳定性就被破坏了。
       比较拗口,举个例子,序列5 8 5 2 9, 我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被         破坏了,所以选择排序不是一个稳定的排序算法。

选择排序第一种写法:
int a[10] = { 3,5,1,7,2,4,6,9,8,0 };
//选择排序,从i开始往后找,找到一个最小的,将a[i]与其交换,即放到数组的第一个位置,然后i++,继续
//从i开始往后找最小的,找到后与a[i]交换,即放到数组的第二个位置,如此循环,直到i为最后一个元素的位置,则数组排好序
	int min, i,j,t;
	for (i = 0;i < 10 ;i++) {
		min = i;
		for (j = i;j < 10;j++) {
			if (a[j] < a[min]) {
				min = j;
			}
		}
		if(j!=min){
			t = a[min];
			a[min] = a[i];
			a[i] = t;
		}

	}
	//输出排序结果
	for (int i = 0;i < 10;i++) {
		cout << a[i] << endl;
	}

选择排序第二种写法:

int a[10] = { 3,5,1,7,2,4,6,9,8,0 };
/*选择排序,从每一次从前j个数中找出最大的数,再跟a[j]交换,然后j--,再重新查找前j个数中最大的数,如此循环,直到j=0,全部排完。*/
	int max, i,j,t;
	for (j = 9;j > 0;j--) {
		max = j;
		for (i = 0;i <= j;i++) {
			if (a[i] > a[max]) {
				max = i;
			}
		}
		if(j!=max){
			t = a[max];
			a[max] = a[j];
			a[j] = t;
		}

	}
//输出排序结果
	for (int i = 0;i < 10;i++) {
		cout << a[i] << endl;
	}
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值