首页 > 其他分享 >归并排序

归并排序

时间:2022-12-12 09:35:41浏览次数:39  
标签:归并 int void high low SqList 排序

排序是非常常见且常用的算法,这次的排序算法是归并排序

见例题如下:

本题要求实现二路归并排序中的归并操作,待排序列的长度1<=n<=1000。

函数接口定义:

void Merge(SqList L,int low,int m,int high);

其中L是待排序表,使排序后的数据从小到大排列。
###类型定义:

#include<stdio.h>
#include<stdlib.h>
typedef  int  KeyType;
typedef  struct {                      
  KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/                       
  int Length;      
}SqList;
void  CreatSqList(SqList *L);/*待排序列建立,由裁判实现,细节不表*/ 
void  MergeSort(SqList L,int low,int high);
void Merge(SqList L,int low,int m,int high); 
int main()
{
  SqList L;
  int i;
  CreatSqList(&L);
  MergeSort(L,1,L.Length);
  for(i=1;i<=L.Length;i++)
   {        
      printf("%d ",L.elem[i]);
   }
  return 0;
}
void MergeSort(SqList L,int low,int high)  
{     
    /*用分治法进行二路归并排序*/  
    int mid;  
    if(low<high)  /*区间长度大于1*/
    {      
        mid=(low+high)/2;               /*分解*/
        MergeSort(L,low,mid);           /*递归地对low到mid序列排序 */ 
        MergeSort(L,mid+1,high);        /*递归地对mid+1到high序列排序 */ 
        Merge(L,low,mid,high);          /*归并*/  
    }  
}
/*你的代码将被嵌在这里 */

输入样例:

第一行整数表示参与排序的关键字个数。第二行是关键字值 例如:

10
5 2 4 1 8 9 10 12 3 6

输出样例:

输出由小到大的有序序列,每一个关键字之间由空格隔开,最后一个关键字后有一个空格。

1 2 3 4 5 6 8 9 10 12 
代码如下:
void Merge(SqList L,int low,int m,int high)
{
	int B[high-low+1];
	int a = low,b = m+1,k = 0;
	while(a<=m&&b<=high)//a和b像两个指针一样移动 
	{
		if(L.elem[a]<=L.elem[b])
			B[k++] = L.elem[a++];
		else if(L.elem[b]<=L.elem[a])
			B[k++] = L.elem[b++];
	}
	while(a<=m)
		B[k++] = L.elem[a++];
	while(b<=high)
		B[k++] = L.elem[b++];
	for(int i = low,k =0;i <= high;i++)
	{
		L.elem[i] = B[k++];
	}
}

  

 

标签:归并,int,void,high,low,SqList,排序
From: https://www.cnblogs.com/yitongtianxia666/p/16975214.html

相关文章

  • 洛谷 P1786 帮贡排序 题解
    原题链接P1786帮贡排序解析实现方法一看题:这不就是道排序吗?但是——用啥办法呢?这自带的排序方法,肯定是不能用了那么我们就来写一个cmp排序函数吧!但是——输出排......
  • 已知一个排好顺序的原数组的情况下再插入一个数并不改变数组排序规律
    题目如下  代码如下1#define_CRT_SECURE_NO_WARNINGGS12#include<stdio.h>3intmain()4{5inta[11]={1,4,6,9,13,16,19,28,40,100......
  • 81. 搜索旋转排序数组 II
    已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。在传递给函数之前,nums 在预先未知的某个下标 k(0<=k<nums.length)上进行了 旋转 ,使数组变为......
  • 33. 搜索旋转排序数组
    整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0<=k<nums.length)上进行了 旋转,使数组变为 [nums[k],nums[k+......
  • 贡献排序
    贡献度表格:学号姓名工作占比20201303张奕博18%20201314黄斯阳15%20201319吴向林15%20201321周慧琳22%20201327刘谨铭15%20201329魏......
  • 实验三-电子公文传输系统2-贡献排序
    六个核桃电子公文传输系统团队项目——小组贡献排序杨赛陈子昂陈鑫徐嘉远林梓祺陈俊池20%17%16.5%16%15.5%15%......
  • 实验三-电子公文传输系统2-贡献排序
    贡献排序学号姓名贡献量(%)20201225张晓平2020201232杨明浩2020201205郭涛1520201209戴骏1520201214于瀛鹏1520201228龙雪江村15......
  • 新手算法第一题----删除排序数组中的重复项
     * @param {number[]} nums * @return {number} */var removeDuplicates = function(nums) {  if(nums == 0 || nums == [])    return 0......
  • 贡献排序
    本小组贡献排序为:张国强23%韩进20%马榕辰17%吴卓航15%徐嘉骏13%焦腾辉12%......
  • 堆排序
    比较常见的排序方法,见例题:本题要求实现堆排序中的筛选函数,待排序列的长度1<=n<=1000。函数接口定义:voidHeapAdjust(HeapTypeH,ints,intm);其中L是待排序表,使排......