排序算法之选择排序、冒泡排序、插入排序、折半插入排序、归并排序

include <stdio.h>

//交换数字 ,这里如果不用指针就会导致数值只会在函数体里交换 
void swap(int* x, int* y)
{
	int mid;
	mid = *x;
	*x = *y;
	*y = mid;
}

//选择排序
	  void Selection_sort(int a[],int n)
	  {
		  int mid;
		  for(int i=n-1;i>0;i--)
		  {
					int maxIdx=i;
					for(int j=0;j<i;j++)
			  {
						if(a[j]>a[i])
						{
							maxIdx=j;
					  mid=a[i];
					  a[i]=a[maxIdx];
					  a[maxIdx]=mid;

				  }	//这里直接交换也可以
				  swap(&a[i],&a[j]);}

		  }
	}


//冒泡排序
void Bubble_sort(int a[],int n)
{
	for(int i=0;i<n;i++)
	{
		bool is_sort=true;//改进算法,如果一次没有交换则说明已经排好

		for(int j=0;j<n-i-1;j++)
		{
			if (a[j] > a[j + 1]) {
				swap(&a[j], &a[j + 1]);
				is_sort = false;
			}
		}
		if(is_sort) return;
	}
}


//插入排序
void insertion_sort(int a[],int n)
{
	for(int i=1;i<n;i++)
	{
		int next=a[i];
		int j;
		for(j=i-1;j>=0&&a[j]>next;j--)// 检索在a[i]之前的数,在两个数之间插进去
		{
			a[j+1]=a[j];
		}
		a[j+1]=next;//注意赋值的位置
	}


}


//归并算法的核心,两个有顺序的数组合并排序时,只要按顺序比大小即可 ,一组比完剩下的就直接排上
void Merge(int a[],int low,int mid,int high)
{
	int n=high-low+1;
	int *b=new int[n];//存一个临时数组来放置比较的结果
	int left=low,right=mid+1,bIdx=0;
	while(left<=mid&&right<=high)
	{
		if(a[left]<=a[right]) b[bIdx++]=a[left++];
		else b[bIdx++]=a[right++];
	}
	while(left<=mid) b[bIdx++]=a[left++];
	while(right<=high) b[bIdx++]=a[right++];

	for(int k=0;k<n;k++)
	{
		a[low+k]=b[k];
	}
	delete  [] b;
}

//函数递归的方法
void Merge_sort(int a[],int low,int high)
{
	if(low<high)
	{
		int mid=(low+high)/2;

		Merge_sort(a,low,mid);
		Merge_sort(a,mid+1,high);

		Merge(a,low,mid,high);
	}
}




int main(void)
{
	int len = 0, num;
	int a[100] = { 0 };
	while (1)
	{
		scanf("%d", &num);
		a[len++] = num;
		if (getchar() == '\n') break;
	}

	//调用想使用的算法进行排序
	Ways_sort(a, 0, len - 1);//
	for (int i = 0; i < len; i++) printf("%d  ", a[i]);
}
posted @ 2020-11-29 00:18  empty_thought  阅读(88)  评论(0)    收藏  举报