快速排序与归并排序

实现原理:

  1. 快速排序:关键点是从队列中任意取出一个值,将其放在正确的位置(左边小于等于此数,右边大于等于此数),确定每个数自己的位置以后队列便是从小大大依次排序。
  2. 归并排序:先将队列拆封成两更小的队列,小队列依次排序,让后再将小队列合并,并确保顺序。

代码:

 1 public class test {
 2     public static void main(String args[]) {
 3         int[] aa = { 4, 5, 2, 7, 8, 2, 1, 6, 4, 4, 3 };
 4         //quicksort(aa, 0, aa.length - 1);
 5         mergesort(aa, 0, aa.length - 1);
 6         for (int i : aa) {
 7             System.out.print(i + " ");
 8         }
 9     }
10
11     /**
12      * 快速排序
13      *
14      * @param aa
15      * @param begin
16      * @param end
17      */
18     public static void quicksort(int[] aa, int begin, int end) {
19         if (begin < end) {
20             int b = begin;
21             int e = end;
22             int base = aa[begin];
23             while (b < e) {
24                 while (b < e && aa[e] >= base)
25                     e--;
26                 aa[b] = aa[e];
27                 while (b < e && aa[b] <= base)
28                     b++;
29                 aa[e] = aa[b];
30             };
31             //b与e相等,任意取一个
32             aa[b] = base;
33             quicksort(aa, begin, b - 1);
34             quicksort(aa, b + 1, end);
35         }
36     }
37
38     /**
39      * 归并排序
40      *
41      * @param aa
42      * @param begin
43      * @param end
44      */
45     public static void mergesort(int[] aa, int begin, int end) {
46         if (begin < end) {
47             int middle = (begin + end) / 2;
48             mergesort(aa, begin, middle);
49             mergesort(aa, middle + 1, end);
50             int[] tmpArr = new int[aa.length];
51             int mid = middle + 1; // 右边的起始位置
52             int tmp = begin;
53             int third = begin;
54             while (begin <= middle && mid <= end) {
55                 // 从两个数组中选取较小的数放入中间数组
56                 if (aa[begin] <= aa[mid]) {
57                     tmpArr[third++] = aa[begin++];
58                 } else {
59                     tmpArr[third++] = aa[mid++];
60                 }
61             }
62             // 将剩余的部分放入中间数组
63             while (begin <= middle) {
64                 tmpArr[third++] = aa[begin++];
65             }
66             while (mid <= end) {
67                 tmpArr[third++] = aa[mid++];
68             }
69             // 将中间数组复制回原数组
70             while (tmp <= end) {
71                 aa[tmp] = tmpArr[tmp++];
72             }
73         }
74     }
75 }
时间: 2025-01-07 12:41:01

快速排序与归并排序的相关文章

插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和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[

[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 qso

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