三种初级排序算法(冒泡、选择、直接插入)java实现及其性能比较

原创 2016年05月30日 22:59:38
排序就是将一组对象按照某种逻辑顺序重新排列的过程。排序在很多地方可以用到,比如在淘宝购物时,完全可以根据自己的需要对搜索到的商品进行排序。在计算时代早期,大家普遍认为30%的计算周期都用在了排序上,但今天这个比例降低了,原因之一就是如今的排序算法更加高效,而并非排序的重要性降低了,因此熟悉一些排序算法是很重要的。最近几天我开始学习排序算法,并用java语言实现了一遍,并且比较了冒泡、选择、直接插入三种排序算法的性能。

注:下面所列出的需要排序的数组元素都实现了Comparable接口,可以重新实现compareTo方法从而选择所需要排序的关键字。

一、冒泡排序

       冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录之间关键字,如果反序则交换,直到没有反序的记录为止。具体实现代码如下,里面有详细注释。

public class Bubble {
	public static void sort(Comparable[] a) {
		int N = a.length;   
		for (int i = 0; i < N; i++) {
			for (int j = N - 1; j > i; j--) {    //注意j是从后往前循环
				if (comp(a[j], a[j - 1]))
					exch(a, j, j - 1);    //如果后者小于前者,则需要交换位置(默认是升序)
			}
		}
	}

	//比较两个元素的大小,若是v小于w返回true,否则返回false
	public static boolean comp(Comparable v, Comparable w) {
		return v.compareTo(w) < 0;
	}
	//交换两个元素的位置
	public static void exch(Comparable[] a, int i, int j) {
		Comparable temp = a[i];
		a[i] = a[j];
		a[j] = temp;
	}
	//打印排序好的数组元素
	public static void show(Comparable[] a) {
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i] + " ");
		}
	}
}
二、选择排序

  选择排序算法的思想是:首先,找到数组中最小的那个元素;其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换);再次,在剩下的元素中找到最小的元素。将它与第二个元素交换位置。如此往复,直到将整个数组排序。具体实现代码如下:

public class Selection {
	public static void sort(Comparable[] a){
		int N = a.length;
		for(int i = 0; i < N; i++){
			int min = i;    //记录最小的位置(一开始认为此元素最小)
			for(int j = i+1; j < N; j++){
				if(comp(a[j], a[min]))    //循环寻找最小的元素,并记录其位置
					min = j;
			}
			exch(a, i, min);   //将其放到i的位置
		}
	}
	
	public static boolean comp(Comparable v, Comparable w){
		return v.compareTo(w) < 0;
	}
	
	public static void exch(Comparable[] a,int i, int j){
		Comparable temp = a[i];
		a[i] = a[j];
		a[j] = temp;
	}
	
	public static void show(Comparable[] a){
		for(int i = 0; i < a.length; i++){
			System.out.print(a[i] + " ");
		}
	}
}
三、直接插入排序

  直接插入排序的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表包含一个元素,无序表中包含n-1个元素。排序过程就是每次从无序表中取出一个元素,将其插入到有序表中的合适位置,使之成为新的有序表,重复n-1次即可完成排序过程。排序过程类似打扑克牌时整理手中牌的过程。具体实现代码如下:

public class Insertion {
	public static void sort(Comparable[] a){
		int N = a.length;
		for(int i = 1; i < N; i++){
			Comparable temp = a[i];   //从底牌抽出的牌准备往手里面放牌(按一定顺序)
			int j = i;     //j表示移动索引
			if(comp(temp, a[j-1])){
				while(j >= 1 && comp(temp, a[j-1])){
					a[j] = a[j-1];     //元素往后移动一格
					j--;    //索引往前走,准备下一次比较
				}
			}
			a[j] = temp;      //此时temp比之前的元素都大,因此其索引为j
		}
	}
	
	public static boolean comp(Comparable v, Comparable w){
		return v.compareTo(w) < 0;
	}
	
	public static void exch(Comparable[] a,int i, int j){
		Comparable temp = a[i];
		a[i] = a[j];
		a[j] = temp;
	}
	
	public static void show(Comparable[] a){
		for(int i = 0; i < a.length; i++){
			System.out.print(a[i] + " ");
		}
	}
}
四、性能比较
       Java语言中Double类型实现了comparable接口,所以我选择随机产生10000个Double类型的数据,分别采用三种算法进行排序。为了不受输入数据的影响,每个排序算法总共做100次这样的排序,然后统计三种算法的平均排序时间。下面附上截图:



        根据上图可以看出直接插入排序是最快的,冒泡排序是最慢的。下面来看一下三种算法的时间复杂度:
        (1)冒泡排序:O(n^2)
        (2)选择排序:O(n^2)
        (3)直接插入排序:O(n^2)
        虽然时间复杂度都是平方级别的,但是冒泡排序一直在交换元素,选择排序对于部分有序的数组来说是不利的,因为它每一个循环都是和数组中所有的元素比较从而选择出最小的元素。所以直接插入排序最快,选择排序次之,冒泡排序最差。
        




版权声明:本文为博主原创文章,未经博主允许不得转载。

java中的三种排序算法详解(直接选择.冒泡.插入)

package lianxi;public class Sort {public static void main(String args[]){int[] a = {2,15,9,7,36,16,1...
  • nana129
  • nana129
  • 2014年08月10日 18:56
  • 907

常见排序算法C++实现(冒泡,直接插入,希尔,堆,归并,简单选择,快排)

#include using namespace std; void swap(int &i,int &j)//实现i,j交换的函数 { i=i^j; j=i^j; i=i^j; } void ...
  • zhouwei1221q
  • zhouwei1221q
  • 2015年04月14日 13:38
  • 367

java实现各种排序算法(包括冒泡排序,选择排序,插入排序,快速排序(简洁版))及性能测试

1、冒泡排序是排序里面最简单的了,但性能也最差,数量小的时候还可以,数量一多,是非常慢的。      它的时间复杂度是O(n*n),空间复杂度是O(1)      代码如下,很好理解。 ...
  • qq_21439971
  • qq_21439971
  • 2016年12月27日 14:36
  • 8063

排序算法(选择、希尔、二分插入、冒泡、直接插入、快速排序)

选择排序法                                                                                    第1趟,在待排序...
  • especialjie
  • especialjie
  • 2016年09月22日 11:21
  • 1238

java排序算法(一)_冒泡排序、插入排序、选择排序

回顾了下数据结构,写了几个简单的排序,包括冒泡排序,插入排序,选择排序。          冒泡排序,从左到右依次判断相邻的两元素的大小如果左边的比右边的大,则交换位置。这样一次从左到右的遍历就能得到...
  • u011638883
  • u011638883
  • 2013年10月20日 13:27
  • 1323

设计模式读书笔记-----策略模式

首先我们需要知道策略模式与状态模式是如此的相似,就犹如一对双胞胎一样。只不过状态模式是通过改变对象内部的状态来帮助对象控制自己的行为,而策略模式则是围绕可以互换的算法来创建成功业务的。两者都可用于解决...
  • gao1440156051
  • gao1440156051
  • 2016年09月08日 17:57
  • 227

七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)

写在前面:                  排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。因此排序掌握各种排序算法非常重要。...
  • To_Be_IT_1
  • To_Be_IT_1
  • 2014年07月16日 08:01
  • 4963

Java排序算法之冒泡排序和选择排序

前言:纵然伤心,也不要愁眉不展,因为你不知是谁会爱上你的笑容。——泰戈尔 《飞鸟集》 原文出处: import java.util.Arrays; class Demo { public...
  • u014158743
  • u014158743
  • 2016年09月19日 23:14
  • 617

经典排序算法设计与分析(插入排序、冒泡排序、选择排序、shell排序、快速排序、堆排序、分配排序、基数排序、桶排序、归并排序)

经典的内排序算法有: 插入排序、冒泡排序、选择排序、shell排序、快速排序、堆排序、分配排序、基数排序、桶排序 为了分析所有的排序情况,给出一个模板程序用于测试,通过改写mySort函数来实现不同的...
  • woshiwanghao_hi
  • woshiwanghao_hi
  • 2013年11月12日 23:21
  • 4083

Java冒泡排序算法的几种实现

研究了一下冒泡算法,原理不详述了,直接代码:
  • heirenheiren
  • heirenheiren
  • 2014年04月08日 16:04
  • 6187
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:三种初级排序算法(冒泡、选择、直接插入)java实现及其性能比较
举报原因:
原因补充:

(最多只允许输入30个字)