C语言-排序-归并排序

思想:运用分治法思想解决排序问题。

void Merge(int A[],int low,int mid,int high)
 {
     int i,j,k;
     int *P = new int[mid-low+1],*Q = new int[high-mid];      

     for (i =0;i  < mid - low +1;++i)   P[i] = A[i+low];

     for (i = 0; i  < high - mid;++i)   Q[i] = A[mid+1+i];      

     i = j = 0,k = low;
     while ((i  <= mid-low) && (j  <= high-mid-1))
     {      

         if (P[i]  <= Q[j])   A[k++] = P[i++];
         else  A[k++]= Q[j++];
     }      

     if (i > mid - low)   { for (;j  <= high-mid-1;++j)   A[k++] = Q[j]; }
     else
     {   for (; i <= mid - low;++i)   A[k++] = P[i];  }      

     delete [] P;
     delete [] Q;
 }      

 void mergeSort(int A[],int left,int right)
 {
     if (left  < right)
     {
         int i = (left + right) / 2;
         MergeSort(A,left,i);
         MergeSort(A,i+1,right);
         Merge(A,left,i,right);
     }
 }

  

时间: 2024-10-15 19:00:14

C语言-排序-归并排序的相关文章

C语言排序算法复习

排序算法有很多种,这里在复习和分析的基础上,做一个自己的总结: 首先要知道有哪些排序算法,google一下,有云C语言7大经典排序算法(也有8大).主要包括冒泡排序,快速排序,选择排序,插入排序,希尔排序,归并排序,堆排序,8大的还有基数排序.各有各的版本,代码写法也各不相同.所以这里以整理思路为先,代码只是作为自己的一个备份. 搞清楚的概念:稳定排序和不稳定排序,就看序列中两个值相等的数,排完序之后的相对位置是否改变,如果改变了就不稳定. 内部排序和外部排序,只用到内存即可完成排序的就叫内部排

插入排序 | 冒泡排序 | 希尔排序 | 堆排序 | 快速排序 | 选择排序 | 归并排序

以下是最近学习各种算法的代码实现: #include <stdlib.h> #include <stdio.h> #include <time.h> #include <limits.h> typedef int EleType; typedef int (*CompFunc)(void *,void *); int IntComp(void * a,void *b) { if(*(int *)a > *(int *)b) return 1; if(*

杂文 - [1.1]使用库语言排序算法

[1.1]使用库语言排序算法 本文地址: http://blog.csdn.net/caroline_wendy 如果不缺少内存, 可以直接使用库的排序算法. 使用库语言的排序程序: C语言性能最好的算法是快速排序(quick sort). C++性能最好的是集合(set)的排序算法. C语言代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <std

C语言排序算法总结

学计算机程序设计的应该都知道,算法是程序之魂.所谓算法,就是解决问题的方法加上有限的实现步骤.算法的特点有有穷性,确定性,有效性,有零个或多个输入,有一个或多个输出.下面我们就来简单总结一下C语言中的三种经典排序算法. 一.冒泡算法. 所谓冒泡排序法,就是对一组数字进行从大到小或从小到大排序的一种算法.具体方法是,相邻的数字两两交换.从第一个数值开始,如果相邻两个数的排列顺序与我们的期望不相同,则将两个数的位置进行交换(对调):如果其余我们期望的相同,则不交换位置.重复这样的过程,一直到最后没有

如何给10^7个数据量的磁盘文件进行排序--归并排序

接上面的题目,假若待排序的数据有重复的呢?这里采用的是归并排序. 1.算法分析:     1.稳定性:归并排序是一种稳定的排序.    2.存储结构要求:可用顺序存储结构.也易于在链表上实现.    3.时间复杂度: 对长度为n的文件,需进行lgn趟二路归并,每趟归并的时间为O(n),故其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlgn)..    4.空间复杂度:需要一个辅助向量来暂存两有序子文件归并的结果,故其辅助空间复杂度为O(n),显然它不是就地排序. 2.总结 与快速排序相

C语言-排序和查找

一 冒泡排序:算法特点:两层循环外层控制排序的趟数,内存控制相邻元素两两比较的次数.n个数共需n-1趟,(i=1;i<n;i++)趟数=n-1-1+1,其中第j趟需要相邻元素两两比较的次数为n-j.可以按照升序也可以安排降序排序.其实还可以优化. oid Bubblesort(int *p,int n){    int i,j,temp;    for(i = 1;i < n;i++)    {        for(j = 0;i < (n - j);j++)        {    

C语言排序算法之简单交换法排序,直接选择排序,冒泡排序

C语言排序算法之简单交换法排序,直接选择排序,冒泡排序,最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 简单交换法排序 1 /*简单交换法排序 2 根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置 3 交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动 4 不稳定 5 */ 6 #include<windows.h> 7 #include<stdio.h> 8 void main(){ 9 int i,j,arr[10

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

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

排序算法的C语言实现-归并排序

归并排序以O(NlogN)最坏时间运行,而说使用的比较次数几乎是最优的,它是递归算法的一个很好的实现.这个算法中基本的操作是合并俩个已排序的表,因为这俩个表是已排序的,说以如果将输出放到第三个表中时该算法可以通过对输入数据一趟排序来完成.基本的合并算法是取俩个输入数组A和B,一个输出数组C,以及三个计数器Aptr,Bptr,Cptr,它们的位置于对应数组的开端.A[Aptr]和B[Bptr]中的较小者被拷贝到C中的下一个位置,相关的计数器向前推进一步,当有一个输入表用完,则将另一个表中剩余部分拷