归并排序---数组

/*merge sort*/
#include <iostream>
using namespace std;

const int max_num = 1000000000;

void mergeData(int *s, int p, int q, int r)
{
    int n1 = q - p + 1;
    int n2 = r - q;
    int ld[n1 + 1];
    int rd[n2 + 1];
    int i = 0, j = 0, k = 0;
    for(i = 0; i < n1; i++)
    {
        ld[i] = s[p + i];
    }
    for(j = 0; j < n2; j++)
    {
        rd[j] = s[q + j + 1];
    }
    i = 0;
    j = 0;
    ld[n1] = max_num; // 哨兵
    rd[n2] = max_num;
    for(k = p; k <= r; k++)
    {
        if(ld[i] <= rd[j])
        {
            s[k] = ld[i];
            i++;
        }
        else
        {
            s[k] = rd[j];
            j++;
        }
    }
}

void mergeSort(int *s, int p, int r)
{
    int q = 0;
    if(p < r)
    {
        q = (p + r) / 2;
        mergeSort(s, p, q);
        mergeSort(s, q+1, r);
        mergeData(s, p, q, r);
    }
}

int main()
{
    int i = 0;
    int s[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    mergeSort(s, 0, 9);
    for(i = 0; i < 10; i++)
    {
        cout << s[i] << " ";
    }
    cout << endl;
    return 0;
}

  

时间: 2024-11-02 21:26:27

归并排序---数组的相关文章

Ex 2_14 去掉数组中所有重复的元素..._第二次作业

首先利用归并排序算法对数组进行排序,时间复杂度为O(nlogn),接着再利用时间复杂度为O(n) 的去重复算法去掉数组中的重复元素.总的时间复杂度为O(nlogn). (这题应该用分支算法解决)以下为分支算法 代码不是分支算法 1 package org.xiu68.ch02.ex2; 2 3 public class Ex2_14 { 4 //基于分治法的归并排序算法 5 public static void main(String[] args) { 6 7 int[] a=new int[

高级排序算法之归并排序,快速排序

前言 承接上文基础排序算法-冒泡,插入,选择,相比之下,归并排序和快速排序更为高效,时间复杂度均为O(nlogn),相比简单排序的O(n^2)好了很多,下面介绍一下这两种算法的思路,实现和主要指标.主要思路来自<数据结构与算法之美> 正文 归并排序 主要思路 在归并排序采用分冶的思想,使用递归实现.描述如下 开始归并排序 如果数组元素小于两个,无需排序,结束 否则需要排序,归并排序数组左侧,归并排序数组右侧,按序合并左右侧 采用的是自顶至下的思路,例如[1,5,3,7,4,6],左侧为[1,5

各种排序算法的复杂度和稳定性

名称 数据对象 稳定性 时间复杂度 ?? 空间复杂度 描述 ?? ?? ?? 平均 最坏 ?? ?? 冒泡排序 数组 ?? (无序区,有序区).从无序区通过交换找出最大元素放到有序区前端. 选择排序 数组 ?? (有序区,无序区).在无序区里找一个最小的元素跟在有序区的后面.对数组:比较得多,换得少. ?? 链表 ?? ?? ?? ?? 插入排序 数组.链表 ?? (有序区,无序区).把无序区的第一个元素插入到有序区的合适的位置.对数组:比较得少,换得多. 堆排序 数组 ?? (最大堆,有序区)

android面试

http://www.apkbus.com/android-115989-1-1.html 面试的几个回答技巧 http://blog.sina.com.cn/s/blog_ad991b1601018mjc.html 2013-5-9号补充:今天最新的腾讯面试题.应该说是全部面试中最难的.我个人感觉.并且是个女面试官.好嗨皮啊,哈哈. 腾讯面试题 1.int a = 1; int result = a+++3<<2; 2.int a = 2; int result = (a++ > 2)

数据结构—各类‘排序算法’实现(上)

数据结构中的排序算法分为比较排序,非比较排序.比较排序有插入排序.选择排序.交换排序.归并排序,非比较排序有计数排序.基数排序.下面是排序的具体分类: 1.直接排序 主要思想:使用两个指针,让一个指针从开始,另一个指针指向前一个指针的+1位置,两个数据进行比较 void InsertSort(int* a, size_t size) {      assert(a);      for (size_t i = 0; i < size - 1; i++)      {           int 

排序算法复杂度

转自:http://blog.csdn.net/xiexievv/article/details/45795719 在计算机科学所使用的排序算法通常被分类为: 计算的时间复杂度(最差.平均.和最好性能),依据列表(list)的大小(n).一般而言,好的性能是O(n log n),且坏的性能是O(n2).对于一个排序理想的性能是O(n).仅使用一个抽象关键比较运算的排序算法总平均上总是至少需要O(n logn). 存储器使用量(以及其他电脑资源的使用) 稳定性:稳定排序算法会让原本有相等键值的纪录

我自己的Android面试试题总结整理

http://blog.sina.com.cn/s/blog_ad991b1601018mjc.html 2013-5-9号补充:今天最新的腾讯面试题,应该说是所有面试中最难的,我个人感觉.而且是个女面试官,好嗨皮啊,哈哈. 腾讯面试题 1.int a = 1; int result = a+++3<<2; 2.int a = 2; int result = (a++ > 2)?(++a):(a+=3); 3.int a = 1234567; int b = 0x06; int resu

算法分析初步

注:这个是我去年这个时候做的笔记,现在这部分内容我已经基本掌握,在博客上做个备份 算法分析 一.渐进符号 渐近分析是一种描述函数在极限附近的行为的方法,算法分析一般考虑给定算法在输入非常大的数据集时候的性能. 定义1.1:\(O\)记号 \(f(n)=O(g(n)):\)表示存在正常量\(c\)和\(n_0\),使得对所有的\(n\ge n_0\),有\(0\le f(n)\le cg(n)\). 这个符号用来表示函数的渐进上界,比如\(2n^2=O(n^3)\). 这其中的等号不是对称的,因为

POJ 2299 Ultra-QuickSort (树状数组or 归并排序分治求逆序对数)

题目大意就是说帮你给一些(n个)乱序的数,让你求冒泡排序需要交换数的次数(n<=500000) 显然不能直接模拟冒泡排序,其实交换的次数就是序列的逆序对数. 由于数据范围是 0 ≤ a[i] ≤ 999,999,999所以先要离散化,然后用合适的数据结果求出逆序 可以用线段树一步一步添加a[i],每添加前查询前面添加比它的大的有多少个就可以了. 也可用树状数组,由于树状数组求的是(1...x)的数量和所以每次添加前查询i-sum(a[i])即可 树状数组: //5620K 688MS #incl