分治大暴走|归并排序,注释详尽

 1 #include <stdio.h>
 2 int GBsort(int *A,int x,int y,int *B)
 3 //A是待排列的数组,数组为[x,y),B是备份数组
 4 {
 5     if(y-x>1) //考虑数组不是单独一个元素的情况
 6     {
 7         int h=x+(y-x)/2;//h=中间点 赋值等价于(x+y)/2
 8         int lm=x,rm=h;//rm=右边待排序标号 lm=左边待排序标号 应用见18行
 9         int i=x;//i=备份数组标号,应用见25行
10
11         //接下来先将中间点两旁的数组分别排序好
12         //使用递归
13         GBsort(A,x,h,B);
14         GBsort(A,h,y,B);
15
16         //现在比较两部分的最小数
17         //小的放入备份数组,大的继续等待比较
18         while(lm<h||rm<y)//当待排序标号都在自己的范围内时
19         {
20             //右边的数已用完则直接把左边的数放入B中
21             //如果右边没用完,看看左边的数是否没用完而且小于右边的数
22             //再把左边的数放入B
23             if(rm>=y||(lm<h&&A[lm]<=A[rm]))//
24                 B[i++]=A[lm++];//放数后顺便移位
25             else B[i++]=A[rm++]; //此外的情况就自然是右边小于左边了
26         }
27         //到这里,处理就结束了,两个部分结合成一个有序的部分
28         //但是数据还在备份数组,所以要把备份数组的数据放回原数组
29         for(i=x;i<y;i++)
30             A[i]=B[i];
31     }
32     //只有一个元素时必然是有序的,不用再排序了
33 }
34 int main()
35 {
36     int t[100],a[100],i,n;
37     scanf("%d",&n);
38     for(i=0;i<n;i++)
39         scanf("%d",&a[i]);
40     GBsort(a,0,n,t);
41     for(i=0;i<n;i++)
42         printf("%d ",a[i]);
43     return 0;
44 }
时间: 2024-09-15 11:14:47

分治大暴走|归并排序,注释详尽的相关文章

算法基础:分治模式,归并排序ΘΘΘΘΘΘ知识小结

1.分治模式在每层递归时都有三个步骤:分解,解决,合并 2.归并排序算法完全遵循分治模式: 分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列 解决:使用归并排序递归的排序两个子序列 合并:合并两个已排序的子序列以产生已排序的答案 3.分析分治算法所需要的时间计算: 假设T(n)是规模为n的一个问题的运行时间,若问题足够小,如对某个常量c,n≦c,则直接求解需要常量时将,我们将其写作Θ(1).假设吧原问题分解成a个子问题,每个子问题的规模是原问题的1/b(对归并排序,a和b都为2,然

5星|李硕《孔子大历史》:详尽还原孔子一生和当时的大小环境

“ 如果看看欧洲的贵族时代,视野会更广一些.欧洲中世纪,国王们和贵族也有分权的矛盾,但像春秋这样贵族彻底架空国王的还不多.所以欧洲是贵族们和国王搞盟誓,订法条,规定各自的势力范围和权利义务.英国这个现象最明显,就是八百年前的“大宪章”,主要是贵族们防范国王权力扩张.#2194” 孔子大历史:初民.贵族与寡头们的早期华夏 作者: 李硕 出版社: 上海人民出版社 副标题: 初民.贵族与寡头们的早期华夏 原作名: 译者: 出版年: 2019年4月1日 页数: 218 定价: 47.20元 装帧: 平装

基于分治算法的归并排序

#include <stdio.h> #include <math.h> void main() { int array[] = {1,212,35,1,456,12376,167,12,7523,71,634}; mergeSort(array, 0, 10); for(int i = 0; i < 11; i++ ) { printf("%d\n", array[i]); } } void mergeSort(int* array, int start

google guava的基础部分Demo实例(注释详尽)

package org.loda.guava; import java.io.UnsupportedEncodingException; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; import org

大文件归并排序

//大文件排序 function countsLines($path){ $fd = fopen($path,"r"); $total=0; while(!feof($fd)){ $total++; fgets($fd); } return $total; } $filePath = "./file.dat"; function checkFiles($path,$rows=5000){ $totalFiles = countsLines($path); $tota

google guava的函数编程部分Demo实例(注释详尽)

package org.loda.guava; import java.util.Map; import java.util.Set; import org.junit.Assert; import org.junit.Test; import com.google.common.base.Function; import com.google.common.base.Functions; import com.google.common.base.Joiner; import com.goog

分治思想--小测试(归并排序后续)

1 package cn.it; 2 3 import java.util.Arrays; 4 // 利用分治思想 实现 归并排序 5 public class Fz { 6 public static void main(String[] args) { 7 int a[]={1,2,3,4,5,6,8,7,3,4,9,0}; 8 int temp[] = new int[a.length]; 9 sortdiv(a, 0, a.length-1, temp); 10 System.out.p

10 大排序算法总结

前言 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不是难事.一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码.对这两种排序的代码一定要信手拈来才行.还有插入排序.冒泡排序.堆排序.基数排序.桶排序等.面试官对于这些排序可能会要求比较各自的优劣.各种算法的思想及其使用场景.还有要会分析算法的时间和空间复杂度.通常查找和排序

算法手记(6)归并排序

今天我主要学习基于分治思想的归并排序算法,这是分治法的典型应用.废话不多说,下面直切正题. 概述: 将两个有序数组归并成一个更大的有序数组,我们称之为归并,人们根据这一操作发明了一种简单的递归排序算法:归并排序. 归并排序最吸引人的是它能够保证任意长度为N的数组排序所需的时间和NlogN成正比:它的主要缺点是需要额外占用的内存空间与N成正比. 分析:实现归并的一种最简单的方法是将两个不同的有序数组归并到第三个数组中,实现的方法很简单,创建一个适当的数组然后将两个数组中的元素一个个从小到大放入这个