基础算法之数据排序一(选择和冒泡)c/c++实现

选择排序

  1. 基本思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在待排序的数列的最前,直到全部待排序的数据元素排完。
  2. 排序过程:
    初始关键字后 [49 38 65 97 76 13 27 49]
    第一趟排序后 13 [38 65 97 76 49 27 49]
    第二趟排序后 13 27 [65 97 76 49 38 49]
    第三趟排序后 13 27 38 [97 76 49 65 49]
    第四趟排序后 13 27 38 49 [76 97 65 49]
    第五趟排序后 13 27 38 49 49 [97 65 76]
    第六趟排序后 13 27 38 49 49 65 [97 76]
    第七趟排序后 13 27 38 49 49 65 76 [97]
    最后排序结果 13 27 38 49 49 65 76 97
    例题:
#include <iostream>
using namespace std;

int main(){
	int i,j,temp,k;
	int a[8]={49,38,65,97,76,13,27,49};
	for(i = 0 ; i <= 7; i++){
		k = i;
		for(j = i+1; j <= 7; j++){
			if(a[j] < a[k]) k = j;
		}
		if(k != i){
			temp = a[i];
			a[i] = a[k];
			a[k] = temp;
		}
	}
	for(i = 0 ; i <= 7; i++){
		cout << a[i] << " ";
	}
	cout << endl;
 }

冒泡排序

思想:以n个人战队为列,从第1个开始,依次比较相邻的两个是否逆序对(逆序对:高在前,矮在后),若逆序就交换这两个人,即第1个和第2个比,若逆序就交换两个人,接着第2个和第3个人比,若逆序就交换两人,接着第3个和第4个人比,若逆序就交换两人,……,直到n-1和n比较。

经过一轮比较后,则把最高的人排到最后,即将最高的人想冒泡一样逐步冒到相应的位置。原n个人的排序问题,就转换成n-1个人的排序问题。

第二轮从第1个人开始,依次比较相邻的两个人是否逆序对,若逆序就交换两人,直到n-2和n-1比较。如此进行n-1轮后,队列为为有序的队列。

比如 排序 6 5 3 4 1 2
第一趟排序:

  		~~5 6~~  3 4 1 2
  		5 ~~3 6~~  4 1 2
  		5 3 ~~4 6~~  1 2
  		5 3 4 ~~1 6~~  2
  		5 3 4 1 ~~2 ***6***~~        最后一趟结束后,6就固定下来了

第二趟排序:

  		5 3 4 1 2 6
  		~~3 5~~  4 1 2 6
  		3 ~~4 5~~  1 2 6
  	3 4 ~~1 5~~  2 6
  	3 4 1 ~~2 ***5***~~  ***6***    最后一趟结束后,5就固定下来了

第三趟排序:

  	3 4 1 2 5 6
  	~~3 4~~  1 2 5 6
  	3 ~~1 4~~  2 5 6
  	3 1 ~~2 ***4***~~  ***5 6***		最后一趟结束后,4就固定下来了

第四趟排序:

  	3 1 2 4 5 6
  	~~1 3~~  2 4 5 6
  	1 ~~2 ***3***~~  ***4 5 6***		最后一趟结束后,3就固定下来了

第五趟排序:

  	~~1 ***2***~~  ***3 4 5 6***			最后一趟结束后,2就固定下来了

代码如下:

#include <iostream>
using namespace std;

int main(){
	int a[6] = {6,5,3,4,1,2};
	int i,j;
	bool ok;
	for(i = 5; i >= 0; i--){
		ok = true;
		for(j = 0; j < i; j++){
			if(a[j] > a[j+1]){
				swap(a[j],a[j+1]);
				ok = false;
			}
		}
		if(ok) break;//如果是一个有序的串,比如 1 2 3 4 5 6,那么就不需要排序
	}
	
	for(i = 0 ;i <= 5 ; i++){
		cout << a[i] << " ";
	}
	cout << endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

松桥爸(仁勇)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值