C++排序算法对比及代码实现

一、C++排序算法对比

二、C++排序算法代码实现

1.选择排序

#include<ipstream>
using namespace std;
void SelectSort(int arr[],int len)
{//逐步选择无序序列中的最小值,整体n-1,局部n-1-i,不稳定 
	for(int i=0;i<len-1;i++)
	{
		for(int j=i+1,temp=arr[i];j<len;j++)
		{
			if(arr[j]<arr[i]){
				arr[i]=arr[j];
				arr[j]=temp;
				temp=arr[i];
			}
		}
	}
}

2.插入排序

void InsertSort(int arr[],int len)
{//无序序列元素插入有序序列中,整体不变,局部减小 
	for(int i=1;i<len;i++)
	{
		for(int j=i,temp=arr[i];j>0&&arr[j]>arr[j-1];j--)
		{
			arr[j]=arr[j-1];
			arr[j-1]=temp;
		}
	}
}Sort(int arr[],int len)
{//无序序列元素插入有序序列中,整体不变,局部减小 
	for(int i=1;i<len;i++)
	{
		for(int j=i,temp=arr[i];j>0&&arr[j]>arr[j-1];j--)
		{
			arr[j]=arr[j-1];
			arr[j-1]=temp;
		}
	}
}

3.冒泡排序

void BubbleSort(int arr[],int len)
{//两两比较,只要没有交换,则停止,整体减小,局部减小 
	for(int last=len-1,current=0;last>0;last=current)
	{
		current=0;
		for(int j=0;j<last;j++)
		{
			if(arr[j]>arr[j+1])
			{
				int temp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=temp;
				current=j;
			}
		}
	}
 } 

4.堆排序

void heapify(int arr[],int first,int end)
{//end表示最后一个元素的下一个元素 
 	int father=first;
	int son=father*2+1;
	while(son<end)
	{
		if(son+1<end&&arr[son]<arr[son+1])son++;
		if(arr[father]>arr[son])break;
		else{
			int temp=arr[father];
			arr[father]=arr[son];
			arr[son]=temp;
		}
		father=son;
		son=father*2+1;
	 } 
}
void HeapSort(int arr[],int len)
 {//不稳定 
 	for(int i=len/2-1;i>=0;i--)//从第一个父节点,初始化堆 
 	{
 		heapify(arr,i,len);
	 }
	 for(int i=len-1;i>0;i--)  //排序,堆的第一个元素和未排序的最后一个元素互换 
	 {
	 	int temp=arr[i];
	 	arr[i]=arr[0];
	 	arr[0]=temp;
	 	heapify(arr,0,i);
	 }
  } 

5.快速排序

int onceSort(int arr[],int first,int end)
 { //end表示最后一个元素 
 	int i=first,j=end;
 	while(i<j)
	 {
	 	while(i<j&&arr[i]<=arr[j])j--;//arr[i]<=arr[j]尽量避免不稳定,但还是不稳定
	 	if(i<j){
	 		int temp=arr[i];
	 		arr[i]=arr[j];
	 		arr[j]=temp;
		 }
	 	while(i<j&&arr[i]<=arr[j])i++;
	 	if(i<j){
	 		int temp=arr[i];
	 		arr[i]=arr[j];
	 		arr[j]=temp;
		 }
	  } 
	return i;
 }

void QuickSort(int arr[],int first,int end)
 {
 	if(first>=end)return;
 	int pivot=onceSort(arr,first,end);
 	QuickSort(arr,first,pivot-1);
 	QuickSort(arr,pivot+1,end);
 }

6.归并排序

void merge(int arr[],int reg[],int first,int end) 
{//end表示最后一个元素 
	if(first>=end)return;
	int len=end-first;
	int mid=len/2+first;//划分成单个元素
	int start1=first,end1=mid;
	int start2=mid+1,end2=end; 
	merge(arr,reg,start1,end1);
	merge(arr,reg,start2,end2);
	int k=first;//归并 
	while(start1<=end1&&start2<=end2)
	{
		reg[k++]=arr[start1]<=arr[start2]?arr[start1++]:arr[start2++];
	}
	while(start1<=end1)
	{
		reg[k++]=arr[start1++];
	}
	while(start2<=end2)
	{
		reg[k++]=arr[start2++];	
	 }	 
	 for(k=first;k<=end;k++)//赋值 
	 {
	 	arr[k]=reg[k];
	 }
}
void MergeSort(int arr[],const int len)
{//稳定排序 
	int reg[len];
	merge(arr,reg,0,len-1);
}

7. Hash排序

void HashSort(vector<int>& nums) 
{//前提是知道nums的取值范围 ,例如:[-10000,10000] 
    vector<int> hashtable(20001);
	for(auto e:nums){++hashtable[e+10000];}  //构造hash表 
    for(int i=0,y=0;i<20001;)  //进行hash排序 
    {
        if(hashtable[i]>0){nums[y]=i-10000;y++;hashtable[i]--;}else{i++;}
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值