`
javaPrimary
  • 浏览: 59849 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java快速排序和合并排序简单性能对比

阅读更多

 

结果:

2097151

合并排序执行时间:443

合并排序递归树深度:4194301

快速排序执行时间:207

快速排序递归树深度:2795757

 

 

package com.zte.it.study.sort;

 

import java.util.Arrays;

 

/**

 * 类名: 排序算法比较 <br/>

 * 功能: TODO ADD FUNCTION. <br/>

 * 时间:2015-3-6 下午6:55:52

 * 

 * @author 10156351

 * @version

 * @since JDK 1.6

 */

public class 排序算法比较

{

    static int recursive = 0;

 

    /**

     * main:(这里用一句话描述这个方法的作用). <br/>

     * 

     * @author 10156351

     * @param args

     * @since JDK 1.6

     */

    public static void main(String[] args)

    {

        int num = Integer.MAX_VALUE >> 10;

        System.out.println(num);

        int[] array = new int[num];

        int[] array2 = new int[num];

        int[] array3 = new int[num];

        int[] array4 = new int[num];

        for (int i = 0; i < num; i++)

        {

            array[i] = (int) (Math.random() * Integer.MAX_VALUE);

            array2[i] = array[i];

            array3[i] = array[i];

            array4[i] = array[i];

        }

        long startTime = System.currentTimeMillis();

        recursive = 0;

        mergeSort(array);

        System.out.println("合并排序执行时间:" + (System.currentTimeMillis() - startTime));

        System.out.println("合并排序递归树深度:" + recursive);

 

        //

        startTime = System.currentTimeMillis();

        recursive = 0;

        quicksort(array2, 0, num - 1);

        System.out.println("快速排序执行时间:" + (System.currentTimeMillis() - startTime));

        System.out.println("快速排序递归树深度:" + recursive);

 

        // startTime = System.currentTimeMillis();

        // recursive = 0;

        // quickSort2(array3, 0, num - 1);

        // System.out.println("快速排序执行时间:" + (System.currentTimeMillis() - startTime));

        // System.out.println("快速排序递归树深度:" + recursive);

        //

        // startTime = System.currentTimeMillis();

        // recursive = 0;

        // quickSort3(array4, 0, num - 1);

        // System.out.println("快速排序执行时间:" + (System.currentTimeMillis() - startTime));

        // System.out.println("快速排序递归树深度:" + recursive);

 

//        for (int i = 0; i < num / 1024; i++)

//        {

//            System.out.print(array2[i] + "    ");

//            if (i % 20 == 19)

//                System.out.println(array2[i]);

//        }

    }

 

    public static void quicksort(int[] v, int left, int right)

    {

        recursive++;

        if (left < right)

        {

            int key = v[left];

            int low = left;

            int high = right;

            while (low < high)

            {

                while (low < high && v[high] > key)

                {

                    high--;

                }

                if (low < high)

                {

                    v[low] = v[high];

                    low++;

                }

 

                while (low < high && v[low] < key)

                {

                    low++;

                }

                if (low < high)

                {

                    v[high] = v[low];

                    high--;

                }

            }

            v[low] = key;

            quicksort(v, left, low - 1);

            quicksort(v, low + 1, right);

        }

    }

 

    public static int[] quickSort2(int[] targetArr, int start, int end)

    {

        recursive++;

        int i = start + 1, j = end;

        int key = targetArr[start];

        if (start >= end)

            return targetArr;

 

        /*

         * 从i++和j--两个方向搜索不满足条件的值并交换

         * 

         * 条件为:i++方向小于key,j--方向大于key

         */

        while (true)

        {

            while (targetArr[j] > key)

                j--;

            while (targetArr[i] < key && i < j)

                i++;

            if (i >= j)

                break;

            swap(targetArr, i, j);

            if (targetArr[i] == key)

            {

                j--;

            }

            else

            {

                i++;

            }

        }

 

        /* 关键数据放到‘中间’ */

        swap(targetArr, start, j);

 

        if (start < i - 1)

        {

            quickSort2(targetArr, start, i - 1);

        }

        if (j + 1 < end)

        {

            quickSort2(targetArr, j + 1, end);

        }

 

        return targetArr;

    }

 

    public static void quickSort3(int[] targetArr, int start, int end)

    {

        recursive++;

        int i = start, j = end;

        int key = targetArr[start];

 

        while (i < j)

        {

            /* 按j--方向遍历目标数组,直到比key小的值为止 */

            while (j > i && targetArr[j] >= key)

            {

                j--;

            }

            if (i < j)

            {

                /* targetArr[i]已经保存在key中,可将后面的数填入 */

                targetArr[i] = targetArr[j];

            }

            /* 按i++方向遍历目标数组,直到比key大的值为止 */

            while (i < j && targetArr[i] <= key)

            /* 此处一定要小于等于零,假设数组之内有一亿个1,0交替出现的话,而key的值又恰巧是1的话,那么这个小于等于的作用就会使下面的if语句少执行一亿次。 */

            {

                i++;

            }

            if (i < j)

            {

                /* targetArr[j]已保存在targetArr[i]中,可将前面的值填入 */

                targetArr[j] = targetArr[i];

            }

        }

        /* 此时i==j */

        targetArr[i] = key;

 

        if (i - start > 1)

        {

            /* 递归调用,把key前面的完成排序 */

            quickSort3(targetArr, start, i - 1);

        }

        if (end - j > 1)

        {

            /* 递归调用,把key后面的完成排序 */

            quickSort3(targetArr, j + 1, end);

        }

    }

 

    public static void swap(int[] arr, int start, int end)

    {

        int tmp = arr[start];

        arr[start] = arr[end];

        arr[end] = tmp;

    }

 

    public static void mergeSort(int[] array)

    {

        recursive++;

        int length = array.length;

        int middle = length / 2;

 

        if (length > 1)

        {

 

            int[] left = Arrays.copyOfRange(array, 0, middle);// 拷贝数组array的左半部分

            int[] right = Arrays.copyOfRange(array, middle, length);// 拷贝数组array的右半部分

            mergeSort(left);// 递归array的左半部分

            mergeSort(right);// 递归array的右半部分

            merge(array, left, right);// 数组左半部分、右半部分合并到Array

        }

    }

 

    // 合并数组,升序

    private static void merge(int[] result, int[] left, int[] right)

    {

 

        int i = 0, l = 0, r = 0;

 

        while (l < left.length && r < right.length)

        {

 

            if (left[l] < right[r])

            {

                result[i] = left[l];

                i++;

                l++;

            }

            else

            {

                result[i] = right[r];

                i++;

                r++;

            }

        }

 

        while (r < right.length)

        {// 如果右边剩下合并右边的

            result[i] = right[r];

            r++;

            i++;

        }

 

        while (l < left.length)

        {

            result[i] = left[l];

            l++;

            i++;

        }

    }

}

 

0
0
分享到:
评论

相关推荐

    java 排序算法 选择排序,插入排序,自顶向上合并排序,合并排序,快速排序

    以下将详细讲解标题和描述中提到的五种排序算法:选择排序、插入排序、自顶向上合并排序、合并排序以及快速排序。 1. **选择排序(Selection Sort)** 选择排序是一种简单直观的排序算法,它的工作原理是每一次从待...

    java 快速排序 折半查找的界面实现 (递归与分治法)

    快速排序和折半查找是两种在计算机科学中广泛使用的算法,尤其在数据处理和搜索操作中扮演着重要角色。在Java编程中,这两种算法都可以通过递归和分治策略进行实现,以提高效率和可读性。下面我们将深入探讨这两个...

    简单的快速排序

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer)...另外,对于具有大量重复元素的数组,可以使用三向切分的快速排序版本,以进一步优化性能。

    java版冒泡排序,插入排序,堆排序,快速排序,归并排序,希尔排序,桶排序

    在编程领域,排序算法是数据结构与算法学习中的基础部分,它们用于整理无序的数据序列。以下是关于Java实现的七种排序算法的详细...在Java编程中,理解这些排序算法的实现和性能特点,有助于写出高效、适应性强的代码。

    JAVA排序算法: 直接插入,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序

    本文将深入探讨Java编程语言中实现的七种主要排序算法:直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序以及归并排序。每种算法都有其独特性,适用于不同的场景和数据特性。 1. **直接插入排序**:...

    各种排序算法比较(java实现)

    本文将详细探讨标题所提及的几种排序算法:合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并结合Java语言的实现进行解析。 1. **合并排序(Merge Sort)**: 合并排序是一种基于分治策略的排序算法...

    常见排序算法的实现与性能比较JAVA版

    问题描述:实现合并排序,插入排序,希尔排序,快速排序,冒泡排序,桶排序算法 实验要求: A. 在随机产生的空间大小分别为 N = 10, 1000,10000,100000 的排序样本(取值为[0,1])上测试以上算法。 B.结果输出...

    java实现的shell排序快速排序归并排序堆排序

    它通过设置一个间隔序列,使得数组中的元素可以进行大规模跳跃,从而减少了比较和交换的次数。间隔序列通常采用Hibbard、Sedgewick或Huang等不同的方法,最终达到整体的排序效果。`shellsort.java`文件应该包含了这...

    算法设计实验报告-快速排序和归并排序

    实验报告中的代码和详细解释将帮助读者理解这两种算法的实现和性能比较。 **推荐进一步研究** 1. 对快速排序的优化,如随机化选择基准元素以避免最坏情况。 2. 探究其他排序算法,如堆排序、插入排序等,比较其...

    基于java不同排序算法的实现及其性能比较

    本项目中,李伟民同学通过Java语言实现了五种常见的排序算法:插入排序、冒泡排序、堆排序、合并排序和快速排序,并对它们的性能进行了分析和比较。以下是这五种排序算法的基本思想和实现方法的详细说明: 1. **...

    用Java编写的求快速排序和合并排序算法

    Java QuickSort and MergeSort 想要得快来拿吧!

    3种排序方法的对比(快速排序,归并排序,冒泡排序)

    例如,快速排序可以利用递归来实现,归并排序则可能需要用到STL中的`std::merge`函数,而冒泡排序则是一系列基本比较和交换操作的组合。 当选择排序算法时,开发者应考虑以下几个因素: 1. 时间复杂度:快速排序...

    快速排序与归并排序的算法比较实验报告

    这篇实验报告将深入探讨两种经典的排序算法——快速排序和归并排序,通过对它们在Java环境中的实现和性能测试,揭示它们在处理不同规模数据时的效率差异。 **快速排序(Quick Sort)** 快速排序由C.A.R. Hoare在...

    java 各种排序总结

    在Java编程中,排序是常见的数据处理任务,涉及到各种不同的算法,每种算法有其特定的适用场景和性能特点。本文主要介绍几种常见的排序算法及其在Java中的实现。 1. **插入排序** - **直接插入排序**:每次将一个...

    java排序简单介绍

    在Java中,有多种内置和自定义的排序算法可供选择,每种都有其特定的适用场景和性能特点。下面将详细介绍几种常见的Java排序方法。 1. **Java内置排序方法**: - **Arrays.sort()**: 这是Java提供的最基础的排序...

    java 快速排序 折半查找的界面实现

    快速排序和折半查找是两种在计算机科学中广泛使用的算法,尤其在数据处理和搜索操作中扮演着重要角色。在Java编程中,这两种算法可以通过图形界面(GUI)进行直观的展示,使得用户能够更好地理解其工作原理。 快速...

    详解Java常用排序算法-快速排序

    快速排序算法的时间复杂度为 O(nlogn),它的性能比冒泡排序和插入排序要好得多,特别是在大型列表上。 快速排序算法的优点: * 高效排序:快速排序算法的时间复杂度为 O(nlogn),使其在大型列表上的性能优于其他...

    java 内部排序算法的性能分析

    - **快速排序**:利用分治思想,选取基准元素,将数组分为两部分,分别对两边进行排序。平均时间复杂度为O(n log n)。 - **归并排序**:同样采用分治策略,将数组分为两半,分别排序后再合并。时间复杂度始终为O(n...

    Java各种排序算法代码.zip

    每种排序算法都有其适用场景和性能特点。例如,冒泡排序和插入排序在小规模数据和部分有序数据时效率较高;而快速排序、归并排序和堆排序在处理大规模数据时表现更优,但归并排序需要额外的内存空间。在实际开发中,...

    Java排序算法练习:1.快速排序 2.归并排序 3.插入排序 4.冒泡排序 5.选择排序 6.堆排序

    这里我们将深入探讨标题和描述中提到的六种排序算法:快速排序、归并排序、插入排序、冒泡排序、选择排序以及堆排序。 1. **快速排序**:由C.A.R. Hoare在1960年提出,是一种高效的分治算法。快速排序的基本思想是...

Global site tag (gtag.js) - Google Analytics