0
点赞
收藏
分享

微信扫一扫

每日刷题 Day23

whiteMu 2022-02-06 阅读 37

题一:希尔排序

#include<iostream>
#include<vector> 
using namespace std;
/*
希尔排序:先将整个待排序分割成若干子序列分别进行直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序 
		 本质上希尔排序是对直接插入排序的优化 
*/
vector<int> ShellSort(vector<int> str){
	int step;  //为当前增量 
	for(step=str.size()/2;step>0;step/=2){
		for(int i=step;i<str.size();i++){	//每次比较两个元素的大小,晓得在前,大的在后 
			int j=i;
			int temp=str[j];
			if(str[j]<str[j-step]){
				while(j-step>=0&&temp<str[j-step]){ //当j-step>=0的时候,则将两元素进行交换 
					str[j]=str[j-step];
					j-=step;
				}
				str[j]=temp;// 若小于0时,则不进行交换 
			}
		}
	}
	return str;
} 

int main(){
	vector<int> str;
	int num;
	cin>>num;
	int temp;
	for(int i=0;i<num;i++){ //构建数组 
		cin>>temp;
		str.push_back(temp);
	}
	str=ShellSort(str);
	for(int i=0;i<str.size();i++){
		cout<<str[i]<<" ";
	}
	return 0;
}

题二:快速排序

#include<iostream>
#include<vector> 
using namespace std;
/*
快速排序:对冒泡排序算法的一种改进
*/ 

void quickSort(vector<int> &str,int low,int high){
	if(low>high)	return;
	int temp=str[low];  //相当于基准元素,用于存放待排序元素
	int i=low;
	int j=high;
	while(i<j){
		while(temp<=str[j]&&i<j){	//j所指元素大于基准元素,则j向前移动 
			j--;		//寻找比基准元素小的元素 
		} 
		while(temp>=str[i]&&i<j){  //i所指元素小于基准元素,则i向后移动 
			i++;		//寻找比基准元素大的元素  
		} 
		if(i<j){		//交换i,j所指的两元素,晓得在前,大的在后 
			int number=str[i];
			str[i]=str[j];
			str[j]=number; 
		} 
	}
	//当i==j的时候退出循环,此时i,j所指位置则为temp的最终存放位置
	str[low]=str[i];
	str[i]=temp; 
	//快速排序就是递归
	quickSort(str,low,i-1);
	quickSort(str,i+1,high); 
} 

int main(){
	vector<int> str;
	int num;
	cin>>num;
	int temp;
	for(int i=0;i<num;i++){ //构建数组 
		cin>>temp;
		str.push_back(temp);
	}
	quickSort(str,0,str.size()-1);
	for(int i=0;i<str.size();i++){
		cout<<str[i]<<" ";
	}
	return 0;
}

题三:归并排序
归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

#include<iostream>
#include<vector> 
using namespace std;

/*
归并排序基本思想:
将初始待排序序列的n个记录两两二路归并,从而得到n/2个有序子序列;
在对n/2个有序子序列进行两两二路归并,,,,,直至得到长度为n的有序序列为止 
*/


//两路归并算法 
void merge(vector<int> &str,int begin,int mid,int end,vector<int> t) {
	int i=begin;
	int j=mid+1;
	int temp=0; //指向辅助数组的元素
	while(i<=mid&&j<=end){	//两侧都有元素
		//将较小的元素放入辅助数组 
		if(str[i]<=str[j]){
			t[temp++]=str[i++];
		}
		else{
			t[temp++]=str[j++];
		}
	} 
	//左侧还有元素
	while(i<=mid){
		t[temp++]=str[i++];
	} 
	//右侧还有元素
	while(j<=end){
		t[temp++]=str[j++];
	} 
	//将辅助数组中的元素赋值到原属组中
	temp=0;
	int l=begin;
	while(l<=end){
		str[l]=t[temp];
		temp++;
		l++;
	} 
}
void mergeSort(vector<int> &str,int begin,int end,vector<int> t){
	if(begin<end){		//当子序列只有一个元素时结束递归
		int mid=(begin+end)/2;	//划分子序列 
		mergeSort(str,begin,mid,t);//对子序列左侧进行排序 
		mergeSort(str,mid+1,end,t); //对右侧进行排序 
		merge(str,begin,mid,end,t); 
	}
} 

int main(){
	vector<int> str;
	vector<int> t; 
	int num;
	cin>>num;
	int temp;
	for(int i=0;i<num;i++){ //构建数组 
		cin>>temp;
		str.push_back(temp);
	}
	mergeSort(str,0,str.size()-1,t);
	for(int i=0;i<str.size();i++){
		cout<<str[i]<<" ";
	}
	return 0;
}
举报

相关推荐

0 条评论