几种排序算法及其代码实现(四)

四、归并排序

1、基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

2、实例

3、java实现

1 packagecom.sort;

2

3 //稳定

4 public class 归并排序{

5    public static void main(String[] args) {

6        int[] a={49,38,65,97,76,13,27,49,78,34,12,64,1,8};

7        System.out.println("排序之前:");

8        for (int i = 0; i < a.length; i++) {

9             System.out.print(a[i]+"");

10         }

11         //归并排序

12        mergeSort(a,0,a.length-1);

13        System.out.println();

14         System.out.println("排序之后:");

15         for (int i = 0; i <a.length; i++) {

16            System.out.print(a[i]+" ");

17         }

18     }

19

20     private static voidmergeSort(int[] a, int left, int right) {

21         if(left<right){

22             int middle =(left+right)/2;

23             //对左边进行递归

24             mergeSort(a, left,middle);

25             //对右边进行递归

26             mergeSort(a, middle+1,right);

27             //合并

28            merge(a,left,middle,right);

29         }

30     }

31

32     private static void merge(int[] a,int left, int middle, int right) {

33         int[] tmpArr = newint[a.length];

34         int mid = middle+1; //右边的起始位置

35         int tmp = left;

36         int third = left;

37         while(left<=middle&& mid<=right){

38             //从两个数组中选取较小的数放入中间数组

39            if(a[left]<=a[mid]){

40                 tmpArr[third++] =a[left++];

41             }else{

42                 tmpArr[third++] =a[mid++];

43             }

44         }

45         //将剩余的部分放入中间数组

46        while(left<=middle){

47             tmpArr[third++] =a[left++];

48         }

49        while(mid<=right){

50             tmpArr[third++] =a[mid++];

51         }

52         //将中间数组复制回原数组

53        while(tmp<=right){

54             a[tmp] =tmpArr[tmp++];

55         }

56     }

57 }

4、分析

归并排序是稳定的排序方法。

归并排序的时间复杂度为O(nlogn)。

速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。

五、基数排序

1、基本思想:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

2、实例

3、java实现

1 packagecom.sort;

2

3 import java.util.ArrayList;

4 import java.util.List;

5 //稳定

6 public class 基数排序{

7    public static void main(String[] args) {

8        int[] a={49,38,65,97,176,213,227,49,78,34,12,164,11,18,1};

9        System.out.println("排序之前:");

10         for (int i = 0; i <a.length; i++) {

11            System.out.print(a[i]+" ");

12         }

13         //基数排序

14         sort(a);

15        System.out.println();

16         System.out.println("排序之后:");

17         for (int i = 0; i <a.length; i++) {

18            System.out.print(a[i]+" ");

19         }

20     }

21

22     private static void sort(int[]array) {

23         //找到最大数,确定要排序几趟

24         int max = 0;

25         for (int i = 0; i <array.length; i++) {

26            if(max<array[i]){

27                 max =array[i];

28             }

29         }

30         //判断位数

31         int times = 0;

32         while(max>0){

33             max = max/10;

34             times++;

35         }

36         //建立十个队列

37         List<ArrayList> queue =new ArrayList<ArrayList>();

38         for (int i = 0; i < 10;i++) {

39             ArrayList queue1 = newArrayList();

40            queue.add(queue1);

41         }

42         //进行times次分配和收集

43         for (int i = 0; i < times;i++) {

44             //分配

45             for (int j = 0; j <array.length; j++) {

46                 int x =array[j]%(int)Math.pow(10, i+1)/(int)Math.pow(10, i);

47                 ArrayList queue2 =queue.get(x);

48                queue2.add(array[j]);

49                 queue.set(x,queue2);

50             }

51             //收集

52             int count =0;

53             for (int j = 0; j < 10;j++) {

54                while(queue.get(j).size()>0){

55                    ArrayList<Integer> queue3 = queue.get(j);

56                     array[count] =queue3.get(0);

57                    queue3.remove(0);

58                    count++;

59                 }

60             }

61         }

62     }

63 }

4、分析

基数排序是稳定的排序算法。

基数排序的时间复杂度为O(d(n+r)),d为位数,r为基数。

总结:

一、稳定性:

稳定:冒泡排序、插入排序、归并排序和基数排序

不稳定:选择排序、快速排序、希尔排序、堆排序

二、平均时间复杂度

O(n^2):直接插入排序,简单选择排序,冒泡排序。

在数据规模较小时(9W内),直接插入排序,简单选择排序差不多。当数据较大时,冒泡排序算法的时间代价最高。性能为O(n^2)的算法基本上是相邻元素进行比较,基本上都是稳定的。

O(nlogn):快速排序,归并排序,希尔排序,堆排序。

其中,快排是最好的,
其次是归并和希尔,堆排序在数据量很大时效果明显。

三、排序算法的选择

1.数据规模较小

  (1)待排序列基本序的情况下,可以选择直接插入排序;

  (2)对稳定性不作要求宜用简单选择排序,对稳定性有要求宜用插入或冒泡

2.数据规模不是很大

(1)完全可以用内存空间,序列杂乱无序,对稳定性没有要求,快速排序,此时要付出log(N)的额外空间。

(2)序列本身可能有序,对稳定性有要求,空间允许下,宜用归并排序

3.数据规模很大

  (1)对稳定性有求,则可考虑归并排序。

  (2)对稳定性没要求,宜用堆排序

4.序列初始基本有序(正序),宜用直接插入,冒泡

参考:http://www.cnblogs.com/liuling/p/2013-7-24-01.html

时间: 2024-10-12 17:21:04

几种排序算法及其代码实现(四)的相关文章

一遍记住Java常用的八种排序算法与代码实现

1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中. 将第一个数和第二个数排序,然后构成一个有序序列 将第三个数插入进去,构成一个新的有序序列. 对第四个数.第五个数--直到最后一个数,重复第二步. 如何写写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用插入. 设定插入数和得到已经排好序列的最后一个数的位数.insertNum和j=i-1. 从最后一个数开始向前循环,如果插入数小于当前数,就将当前数向后移动

Java常用的八种排序算法与代码实现

1.直接插入排序 2.希尔排序 3.简单选择排序 4.堆排序 5.冒泡排序 6.快速排序 7.归并排序 8.基数排序 1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中. 将第一个数和第二个数排序,然后构成一个有序序列 将第三个数插入进去,构成一个新的有序序列. 对第四个数.第五个数--直到最后一个数,重复第二步. 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用插入. 设定插入数和得到已经排好序列的最

几种排序算法及其代码实现(一)

一.插入排序 ?思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置,直到全部插入排序完为止. ?关键问题:在前面已经排好序的序列中找到合适的插入位置. ?方法: –直接插入排序 –二分插入排序 –希尔排序 ①直接插入排序(从后向前找到合适位置后插入) 1.基本思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止. 2.实例 3.java实现 1 package com.sort; 2 3

12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用

出处:http://blog.csdn.net/han_xiaoyang/article/details/12163251. 声明:版权所有,转载请注明出处,谢谢. 0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比较笨的刷题学的,囧),不过又想了想,算法这东西,博主自己学的过程中一直深感,基础还是非常重要的,很多难题是基础类数据结构和题目的思想综

四种排序算法PHP实现类

四种排序算法的PHP实现:1) 插入排序(Insertion Sort)的基本思想是: 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止. 2) 选择排序(Selection Sort)的基本思想是: 每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕. 3) 冒泡排序的基本思想是: 两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止. 4) 快速排序实质上和

13种排序算法详解

0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比较笨的刷题学的,囧),不过又想了想,算法这东西,博主自己学的过程中一直深感,基础还是非常重要的,很多难题是基础类数据结构和题目的思想综合发散而来.比如说作为最基本的排序算法就种类很多,而事实上笔试面试过程中发现掌握的程度很一般,有很多题目,包括很多算法难题,其母题或者基本思想就是基于这些经典算法的,

几种排序算法的学习,利用Python和C实现

之前学过的都忘了,也没好好做过总结,现在总结一下. 时间复杂度和空间复杂度的概念: 1.空间复杂度:是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了,简单说就是递归集算时通常是反复调用同一个方法,递归n次,就需要n个空间. 2.时间复杂度:一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多.一个算法中的语句执行次数称为语句频度或时间频度.记为T(n).一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)

学习Java绝对要懂的,Java编程中最常用的几种排序算法!

今天给大家分享一下Java中几种常见的排序算法的Java代码 推荐一下我的Java学习羊君前616,中959,最后444.把数字串联起来!     ,群里有免费的学习视频和项目给大家练手.大神有空时也会带带大家的,学Java的过程中一定要多问多记,不要怕问题,要去主动的解决问题. 冒泡排序 选择排序 插入排序 归并排序 例如:降序排{10,5,9,6}分为{10,5},{9,6}然后{5,10},{6,9}然后完成 快速排序 就最后一个快速排序可能大家看不太懂,我就举个例子吧 开始输入以下数组

Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等

本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排序.快速排序(重点).堆排序.归并排序等等.看下图: 给定数组:int data[] = {9,2,7,19,100,97,63,208,55,78} 一.直接插入排序(内部排序.O(n2).稳定) 原理:从待排序的数中选出一个来,插入到前面的合适位置. [java] view plain copy