C++冒泡排序,插入排序,选择排序,快速排序,归并排序,希尔排序,附带工具函数和注释

冒泡排序

void BubbleSort(vector<int> &arr)//冒泡排序 
{
	int length=arr.size();
	for(int i=0;i<length-1;i++)
	{
		for(int j=i+1;j<length;j++)
		{
			if(arr[i]>arr[j])//arr[i]<arr[j] 降序 
			{
				swap(arr[i],arr[j]);
			}
		}
	}
	show(arr);
}

插入排序

void InsertSort(vector<int> &arr)//直接插入排序 
{
	int i,j,temp;
	for(i=1;i<arr.size();i++)
	{
		temp=arr[i];
		j=i-1;
		while(j>=0&&temp<arr[j])//j>=0&&temp>arr[j]降序  
		{
			arr[j+1]=arr[j];//数组向后移动 
			j--;
		}
		arr[j+1]=temp;
	}
	show(arr);
}

选择排序

void SelectSort(vector<int> &arr)//选择排序 
{
	int i,j,temp,min;//选择极值的排序法 
	for(i=0;i<arr.size()-1;i++)
	{
		min=i;
		for(j=i+1;j<arr.size();j++)
		{
			if(arr[j]<arr[min])// arr[j]>arr[min] 降序 
			{
				min=j;
			}
		}
		if(min!=i)
		{
			temp=arr[i];
			arr[i]=arr[min];
			arr[min]=temp;
		}
	}
	show(arr);
}

快速排序

void QuickSortMain(vector<int> &arr,int left,int right)//挖坑法 
{
	if(left>=right)
	return ;
	int i=left,j=right,temp=arr[left];//挖起left处的数字 
	while(i<j)
	{
		while(arr[j]>=temp&&i<j)j--;//找到右边比temp小的    arr[j]<=temp&&i<j  降序  
		while(arr[i]<=temp&&i<j)i++;//找到左边比temp大的    arr[i]>=temp&&i<j  降序 
		if(i<j)//交换 
		{
			swap(arr[i],arr[j]);
		}
	}
	arr[left]=arr[i];//此时i==j,这个时候是temp应该待的位置 
	arr[i]=temp;
	QuickSortMain(arr,left,i-1);//递归 
	QuickSortMain(arr,i+1,right);

}
void QuickSort(vector<int> &arr)// 快速排序 
{
	QuickSortMain(arr,0,arr.size()-1);
	show(arr);
} 

归并排序

void Merge(vector<int> &arr,int left,int mid,int right)//归并逻辑 
{
	//cout<<left<<" "<<mid<<" "<<right<<endl;
	vector<int> temp;
	int i=left,k=mid+1;
	while(i<=mid&&k<=right)
	{
		arr[i]<arr[k]?temp.push_back(arr[i++]):temp.push_back(arr[k++]);
		//arr[i]>arr[k]?temp.push_back(arr[i++]):temp.push_back(arr[k++])降序 
	}
	while(i<=mid)
	{
		temp.push_back(arr[i++]);
	}
	while(k<=right)
	{
		temp.push_back(arr[k++]);
	}
	for(int j=left;j<=right;j++)
	{
		arr[j]=temp[j-left];
	}
}
void MergeSortMain(vector<int> &arr,int left,int right)//归并排序,拆成两块排序 
{
	if(right>left)
	{
		int mid=(left+right)/2;
		MergeSortMain(arr,left,mid);
		MergeSortMain(arr,mid+1,right);
		Merge(arr,left,mid,right);//归并两块 
		
	}
}

希尔排序

void ShellSort(vector<int> &arr)//希尔排序
{
	int length=arr.size();
	int gap;//步长 
	for(gap=3;gap>0;gap--)//步长从3到1 
	{
		for(int i=0;i<gap;i++)//步长为3需要执行3次,为2需要执行2次,相当于数组拆分,所以需要执行多次插入排序
		{
			for(int j=i+gap;j<length;j+=gap)
			{
				if(arr[j]<arr[j-gap])// arr[j]>arr[j-gap]  降序 
				{
					int temp=arr[j];
					int k=j-gap;
					while(k>=0&&arr[k]>temp) //  arr[k]<temp  降序 
					{
						arr[k+gap]=arr[k];
						k-=gap;
					}
					arr[k+gap]=temp;
				}
			}
		} 
	}
	show(arr);
} 

工具函数

void show(vector<int> arr)//显示函数
{
	for(int i=0;i<arr.size();i++)
	{
		cout<<arr[i]<<endl;
	}
}
void swap(int &a,int &b)//交换函数
{
	int temp;
	temp=a;
	a=b;
	b=temp;
}
vector<int> rand_vc(int n)//生成n个数字的vector
{
	vector<int> send_arr;
	for(int i=0;i<n;i++)
	{
		send_arr.push_back(rand()%10000);//10000随机数的大小范围
	}
	return send_arr;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值