排序算法回顾

大家好,我是一只学弱狗,记录学习的点点滴滴!

优质文章

优质专栏


	#include <iostream>
	#include <conio.h>
	using namespace std;
	//冒泡排序 
	void Bubble_Sort(int *data,int n);
	//选择排序 
	void Select_Sort(int *data,int n);
	//插入排序(顺序查找)
	void Insert_Sort(int *data,int n);
	//插入排序(二分查找)
	void Insert_Sort_Binary_Search(int *data,int n);
	//快速排序 
	void Quick_Sort(int *data,int n);
	//归并排序 
	void Merge_Sort(int *data,int n);
	int main(){
    
    	
		freopen("排序算法回顾.txt","r",stdin);
		int n;
		cin>>n;
		int *data = new int[n];
		for(int i=0;i<n;i++) cin>>data[i];
		//Bubble_Sort(data,n);
		//Select_Sort(data,n);
		//Insert_Sort(data,n);
		//Insert_Sort_Binary_Search(data,n);
		Quick_Sort(data,n);
		//Merge_Sort(data,n); 
		for(int i=0;i<n;i++) cout<<data[i]<<" ";
		delete[] data;
		data = NULL;
		return 0;
	}
	//冒泡排序 仅相邻的两个元素做比较,若不符合顺序,则交换 
	void Bubble_Sort(int *data,int n)
	{
    
    
		int Pos = -1; 
		bool change = false;//该趟是否有值改变 
		for(int i=n-1;i>=1;i--){
    
    //趟数 最多需要n-1趟
			for(int j=0;j<i;j++){
    
    
				if(data[j] > data[j+1] ){
    
    
					swap(data[j],data[j+1]);
					change = true;
					Pos = j+1;
				}
			}
			if(!change) break;
			if(Pos!=-1){
    
    
				i=Pos;
				Pos = -1;	
			}
			change = false; 
		}
	}
	//选择排序
	void Select_Sort(int *data,int n){
    
    
		for(int i=0;i<n-1;i++){
    
    
			int index=i;
			for(int j=i+1;j<n;j++){
    
    
				if(data[j]<data[index]){
    
    
					index=j;
				}
			}
			swap(data[i],data[index]);
		} 
	} 
	//移动从start到start+length的数组内容  
	void move(int *data,int start,int length){
    
    
		for(int i=start+length;i>start;i--){
    
    
			data[i] = data[i-1];
		}
	}
	//插入排序(顺序查找)
	void Insert_Sort(int *data,int n){
    
    
		for(int i=1;i<n;i++){
    
    
			int tmp = data[i];
			int j=i-1;
			while(j>=0 && tmp<data[j]){
    
    
				j--;
			}
			move(data,j+1,i-j-1);
			data[j+1] = tmp;
		}
	}
	//插入排序(二分查找)
	void Insert_Sort_Binary_Search(int *data,int n){
    
    
		for(int i=1;i<n;i++){
    
    
			int tmp = data[i];
			int left = 0;
			int right = i-1;
			while(left<=right){
    
    
				int mid = (left+right)/2;
				if(tmp<data[mid]){
    
    
					right = mid-1;
				}else if(tmp>=data[mid]){
    
    
					left = mid+1;
				}
			}
			move(data,left,i-left);
			data[left] = tmp;
		}
	}
	void Quick_Sort_Recursion(int *data,int start,int end){
    
    
		if(start>=end) return ;
		int p = data[start];
		int left = start;
		int right = end;
		while(left!=right)
		{
    
    
			while(right>left && data[right]>=p) right--;
			while(right>left && data[left]<=p) left++;
			if(data[left]>data[right]){
    
    
				swap(data[left],data[right]);
			}
		}
		if(data[start] > data[left]){
    
    
			swap(data[start],data[left]);
		}
		Quick_Sort_Recursion(data,start,left-1);
		Quick_Sort_Recursion(data,left+1,end);
	}
	//快速排序 
	void Quick_Sort(int *data,int n){
    
    
		Quick_Sort_Recursion(data,0,n-1);
	}
	void Merge_Sort_Recursion(int *data,int *recode,int start,int end){
    
    
		if(start==end) return ;
		int mid = (start+end)/2;
		Merge_Sort_Recursion(data,recode,start,mid);
		Merge_Sort_Recursion(data,recode,mid+1,end);
		int left = start;
		int right = mid+1;
		int pos = start;
		while(left<=mid &&right<=end){
    
    
			if(data[left]<data[right]){
    
    
				recode[pos++] = data[left++];
			}else{
    
    
				recode[pos++] = data[right++];
			}
		}
		while(left<=mid){
    
    
			recode[pos++] = data[left++];
		}
		while(right<=end){
    
    
			recode[pos++]= data[right++];
		}
		for(int i=start;i<=end;i++){
    
    
			data[i] = recode[i];
		}
	}
	//归并排序 
	void Merge_Sort(int *data,int n){
    
    
		int * recode = new int[n];
		Merge_Sort_Recursion(data,recode,0,n-1);
	}

猜你喜欢

转载自blog.csdn.net/qq_44486437/article/details/112558923