[problem]快速排序和归并排序

最近有时间了解下快速排序和归并排序。

开始觉得很难,一直没有啃这块骨头,现在发现理解了并不难。

快排的思路就是指定一个值,然后将小于他的排到其左边,大于他的排到其右边。

 1 #include <iostream>
 2 #include <set>
 3 #include <vector>
 4 #include <algorithm>
 5 using namespace std;
 6
 7 class Solution {
 8 public:
 9     void qsort(vector<int>& nums,int l,int u) {
10         if (l>=u)
11         {
12             return;
13         }
14         int m=l;
15         for(int i=l+1;i<=u;i++)
16         {
17             if (nums[i]<nums[l])
18             {
19                 m++;
20                 swap(nums[m],nums[i]);
21             }
22         }
23         swap(nums[m],nums[l]);
24         qsort(nums,l,m-1);
25         qsort(nums,m+1,u);
26     }
27 };
28
29 int main()
30 {
31     Solution so;
32     vector<int> input;
33     input.push_back(6);
34     input.push_back(5);
35     input.push_back(3);
36     input.push_back(1);
37     input.push_back(8);
38     input.push_back(7);
39     input.push_back(2);
40     input.push_back(4);
41     so.qsort(input,0,input.size()-1);
42 }

归并利用新空间,将问题化解为各个小部分,边排序边合并。

 1 #include <iostream>
 2 #include <set>
 3 #include <vector>
 4 #include <algorithm>
 5 using namespace std;
 6
 7 class Solution {
 8 public:
 9     void Merge(vector<int>& nums,int p,int q,int r)
10     {
11         int n1 = q-p+1;
12         int n2 = r-q;
13         vector<int> left(n1,0);
14         vector<int> right(n2,0);
15         for(int i=0;i<n1;i++)
16         {
17             left[i]=nums[p+i];
18         }
19         for(int i=0;i<n2;i++)
20         {
21             right[i]=nums[q+i+1];
22         }
23         int i=0,j=0;
24         int k=p;
25         while(i<n1 && j<n2)
26         {
27             if(left[i]<=right[j])
28             {
29                 nums[k++]=left[i++];
30             }
31             else
32             {
33                 nums[k++]=right[j++];
34             }
35         }
36         for(;i<n1;i++)
37         {
38             nums[k++]=left[i];
39         }
40         for(;j<n2;j++)
41         {
42             nums[k++]=right[j];
43         }
44     }
45     void MergeSort(vector<int>& nums,int p,int r)
46     {
47         if(p<r)
48         {
49             int q=(p+r)/2;
50             MergeSort(nums,p,q);
51             MergeSort(nums,q+1,r);
52             Merge(nums,p,q,r);
53         }
54     }
55 };
56
57 int main()
58 {
59     Solution so;
60     vector<int> input;
61     input.push_back(6);
62     input.push_back(5);
63     input.push_back(3);
64     input.push_back(1);
65     input.push_back(8);
66     input.push_back(7);
67     input.push_back(2);
68     input.push_back(4);
69     so.MergeSort(input,0,input.size()-1);
70 }
时间: 2024-11-09 02:57:27

[problem]快速排序和归并排序的相关文章

插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序——C++实现

首先是算法实现文件Sort.h,代码如下: /* * 实现了八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 * 以及快速排序.归并排序.堆排序和LST基数排序 * @author gkh178 */ #include <iostream> template<class T> void swap_value(T &a, T &b) { T temp = a; a = b; b = temp; } //插入排序:时间复杂度o(n^2) template<

快速排序、归并排序、堆排序三种算法性能比较

快速排序.归并排序.堆排序三种排序算法的性能谁最好呢?网上查了一下说快速排序最快.其次是归并排序,最差的是堆排序:而理论上三种排序算法的时间复杂度都是O(nlogn),只不过快速排序最差的会达到O(n^2),但是数据的随机性会消除这一影响,今天就来实际比较一下: 1 #include <iostream> 2 #include<time.h> 3 using namespace std; 4 #define MAX 100000000 5 int data1[MAX],data2[

快速排序,归并排序,堆排序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

单向链表排序:快速排序和归并排序

归并排序改变链接 快速排序改变链接 快速排序改变节点值 所有源码和测试函数 对单向链表的排序有2种形式,只改变节点的值 和 只改变链接 // 节点 struct ListNode { int val; ListNode* next; ListNode(int v, ListNode* n = NULL) { val = v; next = n; } }; 本文链接:单向链表排序:快速排序和归并排序 参考资料链接: 链表排序(冒泡.选择.插入.快排.归并.希尔.堆排序): 1. 归并排序(改变链接

C# 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序

下面列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序,然后是测试的例子.代码位置:http://download.csdn.net/detail/luozuolincool/8040027 排序类: public class Sortings { //插入排序 public void insertSort(int[] array) { int temp = 0; int index = 0; for (int i = 0; i <

七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)

 写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.因此排序掌握各种排序算法非常重要.对下面介绍的各个排序,我们假定所有排序的关键字都是整数.对传入函数的参数默认是已经检查好了的.只是简单的描述各个算法并给出了具体实现代码,并未做其他深究探讨. 基础知识: 由于待排序的记录数量不同,使得排序过程中设计的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机随机存储器中进行的排序过程.另一类是外部排序,

快速排序和归并排序总结

都是两种效率高而且常用的排序方法,今天来总结下. 先说快排: 首先,快速排序的时间复杂度为nlogn,其思想实质为分治法.而这分治法的基本思想为以下三点: 1.先从数列中取出一个基准数. 2.在分治的过程中,比这个基准数小的数全部放到这个基准数的左边,反之则放到右边. 3.然后再对由第二步产生的两个区间再进行第二步的操作,当分出来的区间仅剩一个数为止. #include <stdio.h> #include <string.h> #include <stdlib.h>

Java实现单链表的快速排序和归并排序

本文描述了LeetCode 148题 sort-list 的解法. 题目描述如下: Sort a linked list in O(n log n) time using constant space complexity. 题目要求我们在O(n log n)时间复杂度下完成对单链表的排序,我们知道平均时间复杂度为O(n log n)的排序方法有快速排序.归并排序和堆排序.而一般是用数组来实现二叉堆,当然可以用二叉树来实现,但是这么做太麻烦,还得花费额外的空间构建二叉树,于是不采用堆排序. 故本

九种经典排序算法详解(冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序,计数排序,桶排序,基数排序)

综述 最近复习了各种排序算法,记录了一下学习总结和心得,希望对大家能有所帮助.本文介绍了冒泡排序.插入排序.选择排序.快速排序.归并排序.堆排序.计数排序.桶排序.基数排序9种经典的排序算法.针对每种排序算法分析了算法的主要思路,每个算法都附上了伪代码和C++实现. 算法分类 原地排序(in-place):没有使用辅助数据结构来存储中间结果的排序**算法. 非原地排序(not-in-place / out-of-place):使用了辅助数据结构来存储中间结果的排序算法 稳定排序:数列值(key)