基础数据结构——排序算法

一些基础的排序算法实现

//排序算法
#include<iostream>
using namespace std;
	int a[100];
	int b[100]; 
	int n;
	
//打印函数  显示每次排序后的结果
void display(int a[],int n){
	for(int i=1;i<=n;i++)
		cout<<a[i]<<" ";
	cout<<endl;
} 

//直接插入排序
void InsertSort(int a[],int n){
	int i,j;
	for(i=2;i<=n;i++){
		if(a[i]<a[i-1]){
			a[0]=a[i];
			for(j=i-1;a[0]<a[j];j--)
				a[j+1]=a[j];
			a[j+1]=a[0]; 
		}
	}
} 

//折半插入排序
void InsertSort2(int a[],int n){
	int i,j,low,high,mid;
	for(i=2;i<=n;i++){
		a[0]=a[i];
		low=1,high=i-1;
		while(low<=high){
			mid=(low+high)>>1;
			if(a[mid]>a[0]) high=mid-1;
			else
				low=mid+1;
		}
		for(j=i-1;j>=high+1;--j){
			a[j+1]=a[j]; 
		}
		a[high+1]=a[0];
	}
} 

//希尔排序
void SheelSort(int a[],int n){
	int dk,i,j;
	for(dk=n/2;dk>=1;dk=dk/2)
		for(i=dk+1;i<=n;++i)
			if(a[i]<a[i-dk]){
				a[0]=a[i];
				for(j=i-dk;j>0&&a[0]<a[j];j-=dk)
					a[j+dk]=a[j];
				a[j+dk]=a[0];
			}
} 


//冒泡排序  排序趟数比较少 
void BubbleSort(int a[],int n){
	bool flag;
	for(int i=1;i<=n;i++){
		flag=false;
		for(int j=n;j>i;j--)
			if(a[j-1]>a[j]){
				swap(a[j-1],a[j]);
				flag=true;
			}
			display(a,n);
			if(flag==false)
		return ;	
	}
	
} 


//冒泡排序 没有优化
void BubbleSort2(int a[],int n){
	for(int i=1;i<=n-1;i++)
		for(int j=i+1;j<=n;j++){
			if(a[j]<a[i])
				swap(a[j],a[i]);
		}
} 


//快速排序
void quickSort(int a[],int n,int low,int high){
	if(low>=high) return ;
	int i=low-1,j=high+1,x=a[(low+high)>>1];
	while(i<j){
		do j--;while(a[j]>x);
		do i++;while(a[i]<x);
		if(i<j)
			swap(a[i],a[j]);
	}
	quickSort(a,n,low,j);
	quickSort(a,n,j+1,high);
} 


//选择排序
void SelectSort(int a[],int n){
	for(int i=1;i<n-1;i++){
		int min=i;
		for(int j=i+1;j<=n;j++)
			if(a[j]<a[min]) min=j;
		if(min!=i) swap(a[i],a[min]); 
	}
} 


//堆排序
// 建立大根堆
void HeadAdjust(int a[],int k,int n){
	a[0]=a[k];
	for(int i=k*2;i<=n;i*=2){
		if(i<n&&a[i]<a[i+1])
			i++;
		if(a[0]>a[i]) break;
		else
			a[k]=a[i],k=i;
	}
	a[k]=a[0];
}
void BuildMaxheap(int a[],int n){
	for(int i=n/2;i>=1;i--)
		HeadAdjust(a,i,n);
} 
//堆排序
void HeapSort(int a[],int n){
	BuildMaxheap(a,n);
	for(int i=n;i>1;i--)
	{
	
		swap(a[i],a[1]);
		HeadAdjust(a,1,i-1);
	}
}


//归并排序
void MergeSort(int a[],int l,int r){
	if(l>=r) return ;
	int mid=(l+r)>>1;
	MergeSort(a,l,mid);
	MergeSort(a,mid+1,r);
	int k=0,i=l,j=mid+1;
	while(i<=mid&&j<=r){
		if(a[i]<=a[j])
			b[k++]=a[i++];
		else
			b[k++]=a[j++];
	}
	while(i<=mid) b[k++]=a[i++];
	while(j<=r)   b[k++]=a[j++];
	for(int i=l,j=0;i<=r;i++,j++)  a[i]=b[j];
}


int main(){

	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	
	//InsertSort(a,n);
	//InsertSort2(a,n); 
	//SheelSort(a,n);
	//BubbleSort(a,n);
	//quickSort(a,n,1,n);
   	//SelectSort(a,n);
   	//HeapSort(a,n);
   	
   	MergeSort(a,1,n);
	for(int i=1;i<=n;i++)
		cout<<a[i]<<" ";
		cout<<endl; 
	
} 

猜你喜欢

转载自blog.csdn.net/Unknow_if/article/details/120785879