快速排序和归并排序(JAVA)

快速排序是由C.A.R.Hoare提出来的。快速排序又称为分割交换排序法,是目前公认最佳的排序法,也是使用“分而治之”的方式,会在数据中找到一个虚拟的中间值称为基准,并按此基准将所有打算排序的数据分为两部分。其中小于基准的数据放在左边,而大于基准的数据方在右边,再以同样的方式分别处理左、右两边的数据,直到排序完成为止。

算法分析:

(1)在最好情况和平均情况下,时间复杂度为O(n\log_{2}n);在最坏情况下(每次挑选中间值不是最大就是最小)下,其时间发复杂度为O(_{n}2)。

(2)快速排序不是稳定排序算法。

(3)在最坏情况下,空间复杂度为O(n);在最坏情况下,空间复杂度为O(\log_{2}n)。

(4)快速排序是平均运行时间最快的排序法。

代码实现:

import java.util.Arrays;

public class QuickSort {
    public static void main(String[] args) {
            int[] arr=new int[]{3,6,2,8,4,9};
            sort(arr,0,arr.length-1);
            System.out.println(Arrays.toString(arr));
    }
    public static void sort(int[] arr, int left, int right) {
        //采用双路方法
        int l = left;//左边移动的下标
        int r = right;//右边移动的下标
        int tmp = 0;//临时变量 ,用于下面的交换
        int pivot = arr[(left + right) / 2];//基准
        while (l < r) {
            //找到左边比基准大的数
            while (arr[l] < pivot) {
                l++;
            }//找到右边比基准大的数
            while (arr[r] > pivot) {
                r--;
            }
            if (l >= r) {
                break;
            }//左右交换
            tmp = arr[l];
            arr[l] = arr[r];
            arr[r] = tmp;
            if (arr[l] == pivot) {
                 r--;
            }
            if (arr[r] == pivot) {
                l++;
            }
        }
        if (l==r){
            l++;
            r--;
        }
        if (left<r){
            sort(arr,left,r);
        }
        if(right>l){
            sort(arr,l,right);
        }
    }
}

归并排序(MergeSort):是针对已排序好的两个或两个以上的数列,通过合并的方式将其组合成已排序好的数列。

算法分析:

(1)最好情况、最坏情况及平均情况的时间复杂度为O(n\log_{2}n).

(2)由于在排序过程中需要一个与大数据文件大小同样的额外空间,因此空间复杂度为O(n)。

(3)归并排序法是稳定排序法

代码实现

import chongzai.test;
import org.testng.annotations.AfterTest;


public class MergeSort {
    public static void merge(int[] a, int left, int mid, int right){
        int []tmp=new int[a.length];//辅助数组
        int p1=left,p2=mid+1,k=left;//p1、p2是检测指针,k是存放指针
        while(p1<=mid && p2<=right){
            if(a[p1]<=a[p2])
                tmp[k++]=a[p1++];
            else
                tmp[k++]=a[p2++];
        }
        while(p1<=mid) tmp[k++]=a[p1++];//如果第一个序列未检测完,直接将后面所有元素加到合并的序列中
        while(p2<=right) tmp[k++]=a[p2++];//同上
        //复制回原数组
        for (int i = left; i <=right; i++)
            a[i]=tmp[i];
    }

    public static void mergeSort(int[] a, int start, int end){
        if(start<end){//当子序列中只有一个元素时结束递归
            int mid=(start+end)/2;//划分子序列
            mergeSort(a, start, mid);//对左侧子序列进行递归排序
            mergeSort(a, mid+1, end);//对右侧子序列进行递归排序
            merge(a, start, mid, end);//合并
        }
    }

    public static void main(String[] args) {
        int[] a = {49, 38, 65, 97, 76, 13, 27, 50};
        mergeSort(a, 0, a.length - 1);
        System.out.println("排好序的数组:");
        for (int e : a)
            System.out.print(e + " ");

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值