快速排序,归并排序

  可以看出,两种排序都采用分治的方法。将一个大的数组逐渐分成小的更小的数组,然后进行排序。

不同的是,归并排序采用由小到大的策略,把两个小的数组排序合并得出一个新的排好的数组,逐渐合并一个完整的数组。

快速排序则是由大到小,在数组内部找到一个标量,左小右大分隔开,一直把每个数都这样操作,也就排序完了整个数组。

归并排序:

public class mergeSortStandard{

    public static void main(String[] arg){
        int[] test={1,3,2,4,7,5,6,-1,9,0};
        int[] result=sort(test,0,test.length-1);
        System.out.println(Arrays.toString(result));
    }

    public static int[] sort(int[] num,int low,int high){
        int mid =(low+high)/2;

        if (low<high) {
            sort(num,low,mid);
            sort(num,mid+1,high);
            mergeSort(num,low,mid,high);
        }
        return  num;
    }

    public static void mergeSort(int[] num,int low,int mid,int high){
        int i=low;
        int j=mid+1;
        int k=0;
        int[] temp=new int[high-low+1];

        while (i<=mid && j<=high && i<j) {
            if (num[i]<num[j]) {
                temp[k++]=num[i++];
            }else{
                temp[k++]=num[j++];
            }

        }

        while (i<=mid) {
            temp[k++]=num[i++];
        }
        while (j<=high) {
            temp[k++]=num[j++];
        }

        for (int l = 0; l < temp.length; l++) {
            num[low+l]=temp[l];
        }
    }
}

快速排序

public class quikSort {

    public static void main(String[] args) {

    }

    public void sort(int[] num,int left,int right){
        if (left>right) {
            return;
        }
        int temp=num[left];
        int i=left;
        int j=right;
        int swapTemp;

        while (i!=j) {  //如果i=j了,就需要把哨兵放到中间了
            while (num[j]>=temp && i<j) {
                j--;
            }//从右边找小的放到左边,因为哨兵在左边,所以先从右边开始找

            while (num[i] <= temp && i<j) {
                i++;
            }//从左边找大的放到右边

            if (i<j) {
                swapTemp=num[i];

                num[i]=num[j];
                num[j]=swapTemp;

            }
        }

        num[left]=num[i];//将哨兵放到中间
        num[i]=temp;

        sort(num,left,i-1);//哨兵左边的排序
        sort(num,i+1,right);//哨兵右边的排序

    }

}
时间: 2024-10-29 19:06:03

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

单链表的排序 快速排序 归并排序 quicksort mergesort

原理都很简单,关键是某些边界能否正确写对: #include<iostream> #include<stdio.h> using namespace std; class Node { public: int val; Node* next; Node(int val = 0):val(val),next(NULL){ } }; Node* quicksort(Node* head, Node* tail) { Node *res1 = NULL, *res2 = NULL; No

快速排序 归并排序的非递归版本 备忘

首先,归并排序,分治,递归解决小的范围,再合并两个有序的小范围数组,便得到整个有序的数组. 这是很适合用递归来写的,至于非递归,便是从小到大,各个击破,从而使得整个数组有序.代码如下: void merge(vector<int> &A, int left, int mid, int right) { int i=left,j=mid+1; vector<int> tmp(right-left+1,0); int k=0; while(i<=mid&&

基本排序算法(冒泡排序 选择排序 插入排序 快速排序 归并排序 基数排序 希尔排序)

冒泡排序 public static void bubbleSort(int[] arr){ int lgn = arr.length; for (int i = 0; i < lgn - 1; i++) { for (int j = 0; j < lgn - 1 - i; j++) { if(arr[j] > arr[j + 1]){ int temp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = temp; } } } } 选择排序 publ

Luogu 1177 - 【模板】快速排序 - [快速排序][归并排序][无旋Treap]

题目链接:https://www.luogu.org/problemnew/show/P1177 题意:输入 $n$ 以及后续 $n$ 个整数,让你将这 $n$ 个整数从小到大排序输出. 归并排序(用时: 121ms / 内存: 1568KB): #include<bits/stdc++.h> using namespace std; const int maxn=100000+5; int n,a[maxn],t[maxn]; void Merge(int l,int m,int r) {

分治算法-归并排序、快速排序

分治算法:把一个任务,分成形式和原任务相同,但规模更小的几个部分任务(通常是两个部分),分别完成,或只需要选一部完成.然后再处理完成后的这一个或几个部分的结果,实现整个任务的完成. 分治的典型应用:归并排序.快速排序 归并排序动态图: 1 package com.inbreak.cnblogs.sort; 2 3 import com.inbreak.cnblogs.Helper; 4 5 /** 6 * 归并排序: 7 * 分别前一半.后一半排序 8 * 将前半部分.后半部分归并到一个有序数组

算法 排序NB二人组 堆排序 归并排序

参考博客:基于python的七种经典排序算法     常用排序算法总结(一) 序前传 - 树与二叉树 树是一种很常见的非线性的数据结构,称为树形结构,简称树.所谓数据结构就是一组数据的集合连同它们的储存关系和对它们的操作方法.树形结构就像自然界的一颗树的构造一样,有一个根和若干个树枝和树叶.根或主干是第一层的,从主干长出的分枝是第二层的,一层一层直到最后,末端的没有分支的结点叫做叶子,所以树形结构是一个层次结构.在<数据结构>中,则用人类的血统关系来命名,一个结点的分枝叫做该结点的"

LightHouse/归并排序

灯塔(LightHouse) 题目见https://dsa.cs.tsinghua.edu.cn/oj/problem.shtml?id=1144 最近复习DSA,便在看邓老师的mooc,顺便做做配套的题目,挺有意思的. 一.题目分析 简述思路:两次排序,第一次是对结构体的x坐标进行排序,第二次是计数y坐标中的逆序对/顺序对的数目. 第一次排序可以采用快速排序/归并排序等 第二次就是归并排序计算逆序对数目 注意点如下: 数据范围大小,合适的地方需要使用long long,注意n*n结果范围可能超

数据排序(二)

归并排序 归并排序(MERGE SORT)是又一类不同的排序方法,归并的含义就是将两个或两个以上的有序数据序列合并成一个新的有序数据序列,因此它又叫归并算法. 例如,有两个有序表,(7,10,13,15)和(4,8,19,20),归并后得到的有序表为(4,7,8,10,13,15,19,20) . 归并过程:比较a[i]和b[j]的大小,若a[i]<=b[j],则将第一个有序序列中的元素a[i]复制到r[k]中,并令i和k分别加1,分别指向后一个单元,否则将第二个有序序列的元素b[j]复制到r[

浅析常用的排序算法

排序分内排序和外排序.内排序:指在排序期间数据对象全部存放在内存的排序.外排序:指在排序期间全部对象个数太多,不能同时存放在内存,必须根据排序过程的要求,不断在内.外存之间移动的排序.内排序的方法有许多种,按所用策略不同,可归纳为五类:插入排序.选择排序.交换排序.归并排序.分配排序和计数排序.插入排序主要包括直接插入排序,折半插入排序和希尔排序两种;选择排序主要包括直接选择排序和堆排序;交换排序主要包括冒泡排序和快速排序;归并排序主要包括二路归并(常用的归并排序)和自然归并.分配排序主要包括箱

数据结构学习笔记——排序

1. 分类 2. 7种内排序算法的各种指标 排序方法 平均情况 最好情况 最坏情况 辅助空间 稳定性 移动次数的平均情况 移动次数的最好情况 移动次数的最坏情况 冒泡排序 O(n2) O(n) O(n2) O(1) 稳定 O(n2) 0 O(n2) 简单选择排序 O(n2) O(n2) O(n2) O(1) 稳定 O(n) 0 O(n) 直接插入排序 O(n2) O(n) O(n2) O(1) 稳定 O(n2) O(n) O(n2) 希尔排序 O(nlogn)~O(n2) O(n1.3) O(n