冒泡排序与选择排序(C++代码实现)

继第N次手写写错冒泡排序和选择排序后 决定写一篇博客理清它们…

  • 冒泡排序:像一个水底的小气泡从水底冒出,最开始很小,浮向水面的过程中会变得越来越大,到达水面时达到最大,冒泡排序类似于此过程…
  • 对一个未被排序的数组进行从小到大排序(假设有未排序数组a[n]),第一轮排序时首先将a[0]和a[1]比较,如果a[0]>a[1],则交换a[0]和a[1]的位置,再将此时的a[1]和a[2]比较,如果a[1]>a[2],则交换a[1]和a[2]的位置,以此类推,第一轮排序结束后,可以将最大的数置于a[n-1]处,第二轮排序时,同样将a[0]和a[1]比较,如果a[0]>a[1],则交换a[0]和a[1]的位置,再将此时的a[1]和a[2]比较,如果a[1]>a[2],则交换a[1]和a[2]的位置… …第二轮最后比较是a[n-3]和a[n-2],第二轮结束后可以将倒数第二大的值置于a[n-2]处… …最后一轮比较的是a[0]和a[1],如果a[0]>a[1],则交换a[0]和a[1]的位置,至此整个数组排序完成…
  • 代码实现
#include<iostream>
#include<vector>
using namespace std;
int main(){
	int n;
	cin>>n;
	vector<int> a(n);   //建立数组a[n]
	for(int i=0;i<n;i++){
		cin>>a[i];
	}  
	
	/*  冒泡排序方法  */
	for(int i=0;i<n-1;i++){  //控制循环次数为n-1次,因为只需要要进行n-1轮比较 
		for(int j=0;j<n-i-1;j++){
			if(a[j]>a[j+1]){
				int temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		}
	} 
	
	for(int i=0;i<n;i++){
		printf("%d ",a[i]);
	} 
	return 0;
}

上述冒泡排序代码还可以写为:::

	int count=n-1;   //count是数组最大的有效下标 
	while(count>0){   //控制循环为n-1次 
        for(int i=0;i<count;i++) {
            if (a[i]>a[i+1]) {
                int temp=a[i];
                a[i]=a[i+1];
                a[i+1]=temp;
            }
        }
        count--;
    }
  • 选择排序:第一次遍历数组从a[0]到a[n-1]找到最小的值放在a[0]的位置,第二次遍历数组从a[1]到a[n-1]找到第二小的值放在a[1]的位置,第三次遍历数组从a[2]到a[n-1]找到第三小的值放在a[2]的位置… …以此类推实现数组从小到大排列
  • 代码实现
#include<iostream>
#include<vector>
using namespace std;
int main(){
	int n;
	cin>>n;
	vector<int> a(n);   //建立数组a[n]
	for(int i=0;i<n;i++){
		cin>>a[i];
	}  
	
	/*  选择排序方法  */
	int minIndex; 
	for(int i=0;i<n-1;i++){  //控制循环次数为n-1次 
		minIndex=i;   //minIndex用来保存每一次遍历找到的最小值的下标 
		for(int j=i+1;j<n;j++){
			if(a[j]<a[minIndex]){
				minIndex=j;	
			}
		}
		int temp=a[i];   //与最小值进行交换 将最小值置于合适位置
		a[i]=a[minIndex];
		a[minIndex]=temp;
	}

	for(int i=0;i<n;i++){
		printf("%d ",a[i]);
	} 
	return 0;
}

就是这样啦~

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值