备战复试,每日三题Day28

备战复试,每日三题

题目一:冒泡排序

冒泡排序的思想:(这里我们按照从小到大排序,讲解)

  • 从头开始比较相邻两个数,若逆序(即前一个数比后一个数要大),则交换这两个数
  • 第一轮冒泡排序下来:待排序数中的最大的数到达最后一个位置,最后一个位置固定,再对前n-1个数进行冒泡排序
  • 第二轮冒泡排序下来:待排序数中的最大的数到达倒数第二个位置,倒数第二个位置固定,再对前n-2个数进行冒泡排序
  • 剩下最后一个数不用排序,在第一个位置,为最小的数
void BubbleSort(vector<int>& nums){
	int n=nums.size();
	bool flag=false;
	for(int i=0;i<n-1;i++){
		for(int j=0;j<n-1-i;j++){
			if(nums[j+1]<nums[j}){
				flag=true;
				int temp=nums[j];
				nums[j]=nums[j+1];
				nums[j+1]=temp;
			}
		}
		if(!flag){
			break;
		}else{
			flag=false;
		}
	}
}

题目二:选择排序

选择排序的思想:(这里我们按照从小到大排序,讲解)

  • 从待排序数中找出最小的数,放在第一个位置,第一个位置固定

  • 再从剩余的待排序数中找出最小的数,放在第二个位置,第二个位置固定

  • 最后一个数字不用再排,放在最后一个位置

void selectSort(vector<int>& nums){
	int min=0,index=0;
	int n=nums.size();
	for(int i=0;i<n-1;i++){
		min=nums[i];
		index=i;
		for(int j=i+1;j<n;j++){
			if(nums[j]<min){
				min=nums[j];
				index=j;
			}
		}
		nums[index]=nums[i];
		nums[i]=min;
	}
}

题目三: 归并排序

归并排序(Merge Sort)是利用归并的思想实现的排序方法,该算法采用经典的分治策略将问题分成一些小的问题然后递归求解,即分而治之。

//先划分
void MergeSort(vector<int>& nums,int start,int end,vector<int>& temp){
	if(start<end){
		int mid=(start+end)/2;
		MergeSort(nums,start,mid,temp);
		MergeSort(nums,mid,end,temp);
		merge(nums,start,mid,end,temp);
	}
}
//再合并
void merge(vector<int>& a,int start,int mid,int end,vector<int>& temp ){
		int i=left;
		int j=mid+1;
		int t=0;//指向辅助数组的元素
		while(i<=mid&&j<=right) {//两侧都有元素
			//将较小的元素放入辅助数组
			if(a[i]<=a[j]) {
				temp[t++]=a[i++];
			}else {
				temp[t++]=a[j++];
			}
		}
		//左侧还有元素时,将其依次放入辅助数组
		while(i<=mid) {
			temp[t++]=a[i++];
		}
		//右侧还有元素时,将其依次放入辅助数组
		while(j<=right) {
			temp[t++]=a[j++];
		}
		//将辅助数组中的元素复制到原属组中
		t=0;
		int templeft=left;
		while(templeft<=right){
			a[templeft]=temp[t];
			t++;
			templeft++;
		}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值