归并排序c语言

 1 void mergeAdd(int arr[], int left, int mid, int right, int *temp){
 2   int i = left;
 3   int j = mid + 1;
 4   int k = left;//临时下标
 5   while (i <= mid&&j <= right){
 6     if (arr[i] < arr[j]){
 7       temp[k++] = arr[i++];
 8     }  
 9     else{
10     temp[k++] = arr[j++];
11     }
12   }
13   while (i <= mid){
14     temp[k++] = arr[i++];
15   }
16   while (j <= right){
17     temp[k++] = arr[j++];
18   }
22   memcpy(arr + left, temp + left, sizeof(int)*(right - left+1));
23 }
24 void mergeSort(int arr[],int left,int right,int *temp){
25   int mid = 0;
26   if (left < right){  //归并排序采用先分再并的思想,效率上为O(nlgn), 空间上为O(n),需要耗用多一倍的空间
27     mid = left + (right - left) / 2;
28     mergeSort(arr, left, mid, temp);
29     mergeSort(arr, mid + 1, right, temp);
30     mergeAdd(arr, left, mid, right, temp);
31   }32 }

原文地址:https://www.cnblogs.com/haoxing990/p/11507191.html

时间: 2024-08-03 05:45:48

归并排序c语言的相关文章

排序(6)---------归并排序(C语言实现)

归并排序: 归并操作,也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.归并排序算法依赖归并操作. 归并操作的过程如下: (1) 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 (2) 设定两个指针,最初位置分别为两个已经排序序列的起始位置 (3) 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 (4) 重复步骤3直到某一指针到达序列尾 (5) 将另一序列剩下的所有元素直接复制(抄)到合并序列尾 简单的说,就是将一个序列不断的进行

归并排序C语言实现

归并排序典型的分治策略的体现,时间复杂度是O(nlgn), 空间复杂度是O(n).属于稳定排序. 下面是C语言实现代码. #define MAX 10000000 //p, q, r是均是元素的下标 void merge(int A[], int p, int q, int r) { int n1 = q - p + 1; int n2 = r - q; int * L = (int *)malloc(sizeof(int) * n1 + 1); int * R = (int *)malloc(

归并排序 java语言实现

package sort; import java.util.Random; public class MergeSort { @SuppressWarnings("unused") public boolean initTestArray(int[] testArray) {// 初始化testArray if (testArray == null) return false; Random random = new Random(); for (int i = 0; i <

快速排序,归并排序,堆排序python实现

快速排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n^2),平均情况下为O(n*logn),是不稳定的排序 归并排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*logn),平均情况下为O(n*logn),是稳定的排序 堆排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*logn),平均情况下为O(n*logn),是不稳定的排序 1.快速排序 快速排序的介绍以及C语言实现在这里:快速排序C语言实现 本文介绍的是快速排序python实现: de

常见的9种内部排序(C语言实现)

现在已经把常见的9种内部排序算法都用C语言实现了,为了方便自己和大家查看,就弄了这么一个类似于导航目录的东西. 一.冒泡排序 冒泡排序(C语言版) 二.选择排序 选择排序(C语言版) 三.直接插入排序 直接插入排序(C语言版) 四.希尔排序 希尔排序(C语言版) 五.归并排序 归并排序(C语言版) 六.基数排序 基数排序(C语言版) 七.快速排序 快速排序(C语言版) 八.计数排序 计数排序(C语言版) 九.堆排序 堆排序(C语言版) 介绍完这九个常用的排序算法,怎么能没有一个比较呢?下面是我对

排序算法(Java语言)——归并排序

归并排序mergesort中基本的操作是合并两个已排序的表.因为这两个表已排序,所以若将输出放到第三个表中,则该算法可以通过对输入数据一趟排序完成.基本的合并算法是取两个输入数组A和B,一个输出数组C,以及3个计数器Actr.Bctr.Cctr,他们初始置于对应数组的开始端.A[Actr]和B[Bctr]中的较小者被拷贝到C的下一个位置,相关的计数器向前推进一步.当两个输入表有一个用完的时候,则将另一个表中剩余部分拷贝到C中. 合并另个已排序的表的时间显然是线性的,因为最多进行N-1次比较,其中

归并排序的go语言与C++实现对比

最近对go语言发生了兴趣,发现go语言语法简洁,非常适合算法的描述和实现,于是对归并排序进行了实现. 例子中需要排序的队列是长度为100的从100到1的数列,排序算法是正序排序,排序正确的话,结果应当为1到100. 因为已设定数组最大值为100,因此“哨兵”简略设置为1000,因为不是算法核心部分,此处“哨兵”最大值处理省略. 1 /* 2 归并排序的go语言实现 3 */ 4 package main 5 6 import fmt "fmt" 7 8 func main () { 9

[C语言] 归并排序的特性及实现

[C语言] 归并排序的特性及实现 1.算法特性 归并排序是一种高效且稳定的排序方法,其速度仅次于快速排序,但比较占用内存. 其时间复杂度最好.最差.平均情况均为O(nlog(2)n),空间复杂度为O(n). 2.算法思路 采用分治法的思路将问题分解.细化.逐个解决,即通过递归将无序序列不断分解,直到分解成序列有序(当序列长度为1时一定有序).再将分解的有序序列不断合并成新的有序序列,最后合并成一个有序序列. 3.实现代码 1 #include <stdio.h> 2 #include <

快速排序和归并排序(C语言)

1.0快速排序算法 (1)分解 (2)递归求解 (3)合并 int partition(int a[],int p,int r) { int i=p,j=r+1; int x=a[p]; int temp; while(1)  //将<x的元素交换到左边元素,>x的元素交换到右边元素 { while(a[++i]<x && i<r); while(a[--j]>x); if(i>=j) break; temp=a[i]; a[i]=a[j]; a[j]=