1、归并排序(Merge Sort)

归并排序的性能不受输入数据的影响,始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

1.1 算法描述

  • 把长度为n的输入序列分成两个长度为n/2的子序列;
  • 对这两个子序列分别采用归并排序;
  • 将两个排序好的子序列合并成一个最终的排序序列。

1.2  C++代码(数组):

#include <iostream>
#include <vector> using namespace std;
void merge(int nums[], int left, int mid, int right)
{
int length1 = mid - left + ;
int length2 = right - mid;
int* len1 = new int[length1+];
int* len2 = new int[length2+];
int i, j, k; for (i = ; i < length1; i++) len1[i] = nums[left + i];
for (j = ; j < length2; j++) len2[j] = nums[mid + j + ];
len1[length1] = INT_MAX;
len2[length2] = INT_MAX; for (i = , j = , k = left; k <= right; k++)
{
if (len1[i] <= len2[j])
nums[k] = len1[i++];
else
nums[k] = len2[j++];
}
delete []len1;
delete []len2;
} void mergeSort(int nums[], int left, int right)
{
if (left < right)
{
int mid = (left + right) / ;
mergeSort(nums, left, mid);
mergeSort(nums, mid + , right);
merge(nums, left, mid, right);
}
} int main()
{
int nums[] = { , , , , , , , };
int length = sizeof(nums) / sizeof(int);
mergeSort(nums, , length - ); for (int v : nums)
cout << v << " ";
return ;
}

2. C++代码(链表):

LeetCode 148. Sort List

// 合并两个有序的链表
ListNode* merge(ListNode* head1, ListNode* head2)
{
ListNode guard_node();
ListNode* mList = &guard_node;
while (head1 && head2)
{
if (head1->val <= head2->val)
{
mList->next = head1;
head1 = head1->next;
}
else
{
mList->next = head2;
head2 = head2->next;
}
mList = mList->next;
}
if (head1)
mList->next = head1;
if (head2)
mList->next = head2;
return guard_node.next;
} // 链表实现归并排序
ListNode* sortList(ListNode* head)
{
if (head == NULL || head->next == NULL) return head;
ListNode* fast = head;
ListNode* slow = head;
while (fast->next && fast->next->next)
{
slow = slow->next;
fast = fast->next->next;
}
ListNode* head2 = slow->next;
slow->next = NULL;
ListNode* head1 = head;
head1 = sortList(head);
head2 = sortList(head2);
return merge(head1, head2);
}

C++归并排序(数组&链表)的更多相关文章

  1. 数据结构java(一)数组链表

    链表是数据结构中最基础的内容,链表在存储结构上分成两种:数组形式储存,链式存储. 相比c语言需要的结构体,在java中由于有了面向对象编程,将指针‘藏’了起来,不需要分配内存. 所以只需要创建一个对象 ...

  2. jdk1.8 HashMap 实现 数组+链表/红黑树

    转载至 http://www.cnblogs.com/leesf456/p/5242233.html 一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Ja ...

  3. 【leetcode-88,21】 合并两个有序数组/链表

    合并两个有序数组 (easy,1过) 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nu ...

  4. JAVA并归排序(数组+链表)

    并归排序与快速排序相似,靠分治思想突破了排序算法 O(n2) 的瓶颈. 我们看回顾一下几大排序算法的时间.空间复杂度: 排序算法 平均时间复杂度 最坏时间复杂度 空间复杂度 是否稳定 冒泡排序 O(n ...

  5. 数组链表下标指针map list

    1.时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道.但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间 ...

  6. Sort List (使用归并排序的链表排序)

    Sort a linked list in O(n log n) time using constant space complexity. C++代码的实现: #include<iostrea ...

  7. 【C++】约瑟夫环(数组+链表)

    基于数组: #include<iostream> #include<cstring> #include<cstdlib> using namespace std; ...

  8. 数组 & 链表

    数组 是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据. 使用了连续的内存空间和相同类型的数据,使得它可以“随机访问”,但同时也让数组的删除,插入等操作变得非常低效, 为了保 ...

  9. 1032 Sharing (25分)(数组链表)

    To store English words, one method is to use linked lists and store a word letter by letter. To save ...

随机推荐

  1. 文件夹的层级选择< OC实现 >

    类似文件夹的层级选择,可以搜索和创建新文件夹,点击路径标题可以返回对应层级. 界面有点丑,功能还是大概实现了的!! 代码有点多,还是附上地址吧,有兴趣的可以看看哟!!!    https://gith ...

  2. axios中的qs介绍

    首先qs是一个npm仓库所管理的包,可通过npm install qs命令进行安装. 地址: https://www.npmjs.com/package/qs qs.parse().qs.string ...

  3. 状态管理之 Flux、Redux、Vuex、MobX(概念篇)

    本文是对 Flux.Redux.Vuex.MobX 几种常用状态管理模式的总结,偏向于概念层面,不涉及过多代码. 状态管理 什么是状态管理? 状态管理就是,把组件之间需要共享的状态抽取出来,遵循特定的 ...

  4. python之pandas学习笔记-pandas数据结构

    pandas数据结构 pandas处理3种数据结构,它们建立在numpy数组之上,所以运行速度很快: 1.系列(Series) 2.数据帧(DataFrame) 3.面板(Panel) 关系: 数据结 ...

  5. 【并行计算-CUDA开发】CUDA shared memory bank 冲突

    CUDA SHARED MEMORY shared memory在之前的博文有些介绍,这部分会专门讲解其内容.在global Memory部分,数据对齐和连续是很重要的话题,当使用L1的时候,对齐问题 ...

  6. 【深入浅出-JVM】(1):Java 虚拟机

    Java 虚拟机地位 种类 BEA的JRockit Solaris的Exact VM IBM的J9 感谢您的耐心阅读,如果您发现文章中有一些没表述清楚的,或者是不对的地方,请给我留言,您的鼓励是作者写 ...

  7. vim 常用基本

    vim 基本操作 0. 基本操作 :w // 保存当前文件 :q // 退出vim :wq // 保存退出 :w! // 强制保存当前文件 :q! // 强制退出(可以忽略修改) :!cmd // 执 ...

  8. PAT A1042 Shuffling Machine

    自己思路,没通过 #include <cstdio> #define N 54 int main() { #ifdef ONLINE_JUDGE #else freopen("1 ...

  9. GridFS文件操作

    目录 1. GridFS介绍 2. GridFS 存取文件测试 2.1 新建项目配置pom.xml 2.2 在application.yml配置mongodb 2.3 GridFS存取文件测试 2.4 ...

  10. Java回调实现异步 (转)

    出处: Java回调实现异步 在正常的业务中使用同步线程,如果服务器每处理一个请求,就创建一个线程的话,会对服务器的资源造成浪费.因为这些线程可能会浪费时间在等待网络传输,等待数据库连接等其他事情上, ...