冒泡,选择,插入,希尔,快速,归并

冒泡,选择,插入,希尔,快速,归并

选择类的排序:选择排序,堆排序

交换类的排序:冒泡,快排

c 复制代码
#include <stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#define swap(a,b) {typeof(a) t=(a);a=b;b=t;}
#define LEN 15
typedef void (*SortFP)(int *,int );
void show(int *,int );


//冒泡1
void bubble_sort(int *arr,int n)
{
	bool flag=true;
	for(int i=0;i<n-1&&flag;i++ )
	{
		flag=false;
		for(int j=0;j<n-i-1;j++)
		{
			if(arr[j]>arr[j+1])
			{
			int temp=arr[j];
			arr[j]=arr[j+1];
			arr[j+1]=temp;
			 
			 flag=true;
			}
		}
	}
	show(arr,n);
	printf(":%s\n",__func__);
}
//选择1
void Select_sorting(int *arr,int n)
{
	bool flag=true;
	for(int i=0;i<n-1&&flag;i++)
	{
		flag=false;
		int temp=i;

		for(int j=i+1;j<n;j++)
		{
			if(arr[temp]>arr[j])
					temp=j;

				flag=true;
		}
		if(temp!=i)
		{
			int temp1=arr[temp];
			arr[temp]=arr[i];
			arr[i]=temp1;
		}		
	}
	show(arr,n);
	printf(":%s\n",__func__);
}

//插入1
void insertion_Sort(int *arr,int n)
{
	int i;
	for(int j=1;j<n;j++)
	{
		int temp=arr[j];
		for( i=j;i>0&&arr[i-1]>temp;i--)
		{
				arr[i]=arr[i-1];
		}
		arr[i]=temp;
	}
}

//插入2
void insertion_Sort2(int *arr,int n)
{
	for(int i=1,j=0;i<n;i++)
	{
		int val=arr[i];
		for( j=i;j>0&&arr[j-1]>val;j--)
		{
			arr[j]=arr[j-1];	
		}
		if(j!=i)  arr[j]=val;
		}
		show(arr,n);
		printf(":%s\n",__func__);
	
		
}
//希尔1
void shell_sort(int *arr,int n)
{
	int i;	
	
	for(int d=n>>1;d>0;d=d>>1)
	{
	for(int j=d;j<n;j=d+j)
	{
		int temp=arr[j];	
		for( i=j;i>=d&&arr[i-d]>temp;i-=d)
		{
			arr[i]=arr[i-d];	
			
		}
		arr[i]=temp;
	}

	
	}
}
//希尔2
void shell_Sort2(int *arr,int n)
{
	for(int d=n/2;d>0;d/=2)
	{
	for(int i=d,j=0;i<n;i++)
	{
		int val=arr[i];
		for( j=i;j>=d&&arr[j-d]>val;j=j-d)
		{
			arr[j]=arr[j-d];	
		}
		if(j!=i)  arr[j]=val;
		}

	}
		show(arr,n);
		printf(":%s\n",__func__);
	
}	
		
//归并1
void Merge_sort(int *arr,int *reg,int start,int end)
{
	if(start>=end )return ;
	
	int	len=end-start;
	int	mid=(len>>1)+start;
	int	start1=start,end1=mid;
	int start2=mid+1,end2=end;
	
	Merge_sort(arr,reg,start1,end1);
	Merge_sort(arr,reg,start2,end2);
	
	int k=start;
	while(start1<=end1&&start2<=end2)
	{
		reg[k++]=arr[start2]>arr[start1]?arr[start1++]:arr[start2++];
	}
	
	while(start1<=end1)
	{
	 	reg[k++]=arr[start1++];	
	}
	while(start2<=end2)
	{
		reg[k++]=arr[start2++];	
		
	}
	for(k=start;k<=end;k++)
	{
		arr[k]=reg[k]	;
		
	}
	
}

//快速1
void Quick_Sort(int *arr,int l,int h)
{
	if(l>=h) return ;
	int low=l;
	int high=h;
	int pivot=arr[low];


	while(low<high)
	{
	while(low<high&&arr[high]>=pivot) high--;	
		arr[low]=arr[high];
	
	while(low<high&&arr[low]<pivot)low++;
		arr[high]=arr[low];
		
	}
	arr[low]=pivot;

	Quick_Sort(arr,l,low-1);
	Quick_Sort(arr,low+1,h);
	
}

void quick_sort(int *arr,int len)
{
	  Quick_Sort(arr,0,len-1);
 		show(arr,len);
		printf(":%s\n",__func__);
}




void show(int *arr,int n)
{
	for(int i=0;i<n;i++)
	{
		printf("%d ",arr[i]);	
	}
	printf("\n");
}




int main(int argc,const char* argv[])
{
	int arr[LEN]={};
	SortFP sort[]={bubble_sort,Select_sorting,insertion_Sort2,shell_Sort2,quick_sort};
	for(int i=0;i<sizeof(sort)/sizeof(sort[0]);i++)
	{
		for(int j=0;j<LEN;j++)
		{
			arr[j]=rand()%100;
			printf("===");
		}
		
		printf("\n");
	
	show(arr,LEN);
	printf("排序前\n");
	sort[i](arr,LEN);
}
   //bubble_sort(arr,n);   //冒泡
	//Select_sorting(arr,n);//选择排序
	//shell_sort(arr,n);      //希尔排序
	//insertion_Sort(arr,n);  //插入排序
	//quick_sort(arr,n);
	/*int reg[6]={};
	Merge_sort(arr,reg,0,n-1);//归并排序*/
	
	return 0;
}
相关推荐
打鱼又晒网42 分钟前
数据类型:List
数据结构·list
java程序员CC1 小时前
记录为什么LIst数组“增删慢“,LinkedList链表“查改快“?
数据结构·链表·list
AndrewHZ2 小时前
【图像处理基石】什么是油画感?
图像处理·人工智能·算法·图像压缩·视频处理·超分辨率·去噪算法
.格子衫.2 小时前
015枚举之滑动窗口——算法备赛
数据结构·算法
J先生x3 小时前
【IP101】图像处理进阶:从直方图均衡化到伽马变换,全面掌握图像增强技术
图像处理·人工智能·学习·算法·计算机视觉
爱coding的橙子5 小时前
每日算法刷题 Day3 5.11:leetcode数组2道题,用时1h(有点慢)
算法·leetcode
D_aniel_9 小时前
排序算法-计数排序
java·排序算法·计数排序
?abc!10 小时前
缓存(5):常见 缓存数据淘汰算法/缓存清空策略
java·算法·缓存
BioRunYiXue10 小时前
一文了解氨基酸的分类、代谢和应用
人工智能·深度学习·算法·机器学习·分类·数据挖掘·代谢组学
jiunian_cn11 小时前
【c++】异常详解
java·开发语言·数据结构·c++·算法·visual studio