排序算法学习

排序算法

学习自六大排序算法

冒泡排序

//冒泡排序
void MPswap(int* arr,int n)
{
	int end=n;
	while(end)//最好的情况处理N次,最差的情况N*N次 
	{	
	int flag =0;
	for(int i=1;i<end;++i)//不能i++ 
	{
		if(arr[i-1]>arr[i])//前一项比当前项大,交换位置 
		{
			int temp=arr[i];
			arr[i]=arr[i-1];
			arr[i-1]=temp;
			flag=1;
		}
	}
	if(flag == 0)//当所有元素排列完毕 不再有大在前的情况flag为0则跳出while循环 
	{
		break;
	}	
	}
}

插入排序

//插入排序 多少有点难理解,老老实实看原文讲解 
//必须理解了怎么排的序 
void CRswap(int* arr,int n)
{
	for(int i=0;i<n-1;++i)
	{
		int end=i;//记下有序序列最后一个元素下标 
		int temp=arr[end+i];//将要被排序的元素
		while(end>=0)
		{
			if(temp<arr[end])//temp向前比较一位,如果小于 
			{
				arr[end+1]=arr[end]//前方元素后移(temp的值未变) 
				end--; 
			}
			else break;
		 } 
		 arr[end+1]=temp;
	 } 
 } 

希尔排序

大佬确实厉害,下面的写法兼顾了gap≠1时的置换和gap=1时候的插入排序

 //希尔排序 注意和插入排序的联系
 void ShellSort(int* arr,int n)
 {
 	int gap=n;
 	while(gap<1)//gap>1使最后一次循环gap最大仅能为1
	 {
	 	gap=gap/2;//gap每次对半
		 for(int i=0;i<n-gap;++i)//每次仅需要比较n-gap个元素
		 {
		 	int end=i;
		 	int temp=arr[end+gap];//temp此时为后面的元素 
		 	while(end>=0) 
			 {
			 	if(temp<arr[end])//如果后面的小于前面的 
			 	{
			 		arr[end+gap]=arr[end];//换位 
			 		end-=gap;//个人感觉这一步是为了和下面[end+gap]=temp联用 
				 }
				 else break;				 
			  } 
			  arr[end+gap]=temp;
		  } 
	  } 

选择排序

 	//选择排序  一次寻找最大值和最小值可以增加一倍效率 
	 void swap(int*x,int*y)
	 {
	 	int temp=*x;
	 	*x=*y;
	 	*y=temp;
	 }
	 
	 
	 void SelectSort(int* arr,int n);
	 {
	 	int begin = 0;int end=n-1;//记录起始位置与结尾位置
		 while(begin<end) 
		 int max=begin;
		 int min=begin;//记录最大值最小值的编号
		 for(int i=begin;i<=end;++i)
		 {
		 	if(arr[i]<arr[min])
		 	mini=i;
		 	if(arr[i]>arr[max])
		 	max=i;//若碰到比最大值/最小值大/小的,则替换编号
			  
		  } 
		  swap(&arr[begin],&arr[min]);//最小值放最前
		  if(begin == max)max=min;//防止最大的数在begin位置被换走  
		  swap(&arr[end],&arr[max]);//最大值放最后
		  begin++;
		  end--;
		   
	  } 
posted @ 2022-04-05 16:40  孟夏十二  阅读(52)  评论(1编辑  收藏  举报