java (冒泡、选择、插入)排序

原创 2013年12月04日 10:19:48

 

 1、冒泡排序 Bubble Sort

 

       最简单的排序方法是冒泡排序方法。这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。显然,处理一遍之后,“最轻”的元素就浮到了最高位置;处理二遍之后,“次轻”的元素就浮到了次高位置。在作第二遍处理时,由于最高位置上的元素已是“最轻”元素,所以不必检查。一般地,第i遍处理时,不必检查第i高位置以上的元素,因为经过前面i-1遍的处理,它们已正确地排好序。这个算法可实现如下。

 

 

2、选择排序 Selection Sort

 

       选择排序的基本思想是:对待排序的记录序列进行n-1遍的处理,第1遍处理是将L[1..n]中最小者与L[1]交换位置,第2遍处理是将L[2..n]中最小者与L[2]交换位置,......,第i遍处理是将L[i..n]中最小者与L[i]交换位置。这样,经过i遍处理之后,前i个记录的位置就已经按从小到大的顺序排列好了。

  当然,实际操作时,也可以根据需要,通过从待排序的记录中选择最大者与其首记录交换位置,按从大到小的顺序进行排序处理。

 

备注:个人理解冒泡排序是每次和相邻的数据比较之后(如果符合条件)就进行交换;

而选择排序是每次选择最小的,确定之后再做交换,然后依次放在数组的最前或者最后面

 

 

3、插入排序 Insertion Sort
插入排序的基本思想是,经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i]又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]和L[i-1],如果L[i-1]≤ L[i]騆[1..i]已排好序,第i遍处理就结束了;否则交换L[i]与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1≤j≤i-1),使得L[j] ≤L[j+1]时为止。
  简言之,插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。插入排序方法分直接插入排序和折半插入排序两种,这里只介绍直接插入排序,折半插入排序留到“查找”内容中进行。
  图1演示了对4个元素进行直接插入排序的过程,共需要(a),(b),(c)三次插入。

 

 

 

 

package hb.mm;

import java.util.LinkedList;

public class SortDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int[] arr = { 5, 6, 2, 7, 1, 3, 53, 8 };

		// int[] result = doBubbleSort(arr);
		// int[] result = doChooseSort(arr);
		//int[] result = doInsertSort_for(arr);
		int[] result = doInsertSort_while(arr);
		
		new LinkedList();

		printArr(result);
	}

	/**
	 * 循环数组
	 * @param arr 需要便利的数组
	 */
	public static void printArr(int[] arr) {
		for (int a : arr) {
			System.out.println(a);
		}
	}

	/**
	 * 插入排序 使用while循环  
	 * @param arr
	 * @return
	 */
	public static int[] doInsertSort_while(int[] arr){
		int length = arr.length;
		//从第一个数组开始,与第零个比较
		for(int i=1;i<length;i++){
			int temp = arr[i];
			int j=i;
			//将需要插入的数据与最大的比较,然后逐步向小的方向移动
			while(arr[j-1]>temp){
				arr[j]=arr[j-1];
				j--;
				if(j<=0){
					break;
				}
			}
			arr[j] = temp;
		}
		return arr;
	}
	
	/**
	 * 插入排序 使用for循环
	 * @param arr
	 * @return
	 */
	public static int[] doInsertSort_for(int[] arr) {
		int length = arr.length;
		for (int i = 1; i < length; i++) {
			int temp = arr[i];
			int j;
			for (j = i; j > 0; j--) {
				if (arr[j - 1] > temp) {
					arr[j] = arr[j - 1];
				} else {
					// 如果当前的数,不小前面的数,那就说明不小于前面所有的数,
					// 因为前面已经是排好了序的,所以直接通出当前一轮的比较
					break;
				}
			}
			arr[j] = temp;
		}

		return arr;
	}

	/**
	 * 选择排序
	 * @param arr
	 * @return
	 */
	public static int[] doChooseSort(int[] arr) {
		int length = arr.length;
		int temp;
		for (int i = 0; i < length; i++) {
			temp = arr[i];
			int j;
			int smallestLocation = i;// 最小数的下标
			for (j = i + 1; j < length; j++) {
				if (temp > arr[j]) {
					temp = arr[j];// 取出最小值
					smallestLocation = j;// 取出最小值所在的下标
				}
			}
			//选出了最小的数据,然后放在smallestLocation的位置,循环之后只是最后交换一次
			arr[smallestLocation] = arr[i];
			arr[i] = temp;
		}
		return arr;
	}

	/**
	 * 冒泡排序
	 * @param arr
	 * @return
	 */
	public static int[] doBubbleSort(int[] arr) {
		int length = arr.length;
		for (int i = 0; i < length; i++) {

			for (int j = i + 1; j < length; j++) {
				int temp;
				//比较相邻的下一个数据,如果相等则交换(交换多次,与选择排序不一样)
				if (arr[i] > arr[j]) {
					temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp;
				}
			}

		}
		return arr;
	}

}

 

备注:对于static修饰的方法而言,则可以使用类来直接调用该方法,如果在static修饰的方法中使用this关键字,则这个关键字就无法指向合适的对象。所以static修饰的方法中是不能使用this引用的,由于static修饰的方法不能使用this引用,所以static修饰的方法不能访问不使用static修饰的普通成员。

因此java语法规定:静态成员不能直接访问非静态成员

冒泡、插入、快速、选择排序的java实现

摘要:算法的好处什么的都不再赘述、单刀直入——直接贴出整理的几个常用的算法的基本描述、原理和java的实现过程。本篇是武功秘籍上部、下部还在酝酿中。 注:问题的引出都是对一系列可进行排序的数字进行排序...
  • chenghuaying
  • chenghuaying
  • 2014年03月05日 17:32
  • 2954

排序算法(1)-插入,选择,冒泡

排序算法作为许多程序的中间步骤,是计算机科学中的一个基本操作。 一、问题描述     排序算法输入的是n个数的一个序列,输出为输入的一个排列,满足a1’ 简言之就是输入一个序列,输出的是这个数组...
  • H2008066215019910120
  • H2008066215019910120
  • 2014年07月16日 09:58
  • 1137

冒泡,选择,二分查询之java实现

1.选择法排序 转载出自:http://blog.csdn.net/wentasy/article/details/7438064 选择法排序的基本思想是:首先从待排序的n个数中找出最...
  • yibing548
  • yibing548
  • 2016年03月08日 16:36
  • 591

简单的排序--冒泡、选择、插入

简单的冒泡、选择、插入算法,进行数据的排序。进行简单的总结
  • whm114336793
  • whm114336793
  • 2017年04月06日 14:58
  • 221

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

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

js实现排序算法(冒泡、选择、插入、二分插入、快速、希尔)

插入排序从第一个元素开始,该元素可以认为已经被排序; 取出下一个元素,在已经排序的元素序列中从后向前扫描; 如果该元素(已排序)大于新元素,将该元素移到下一位置; 重复步...
  • charlene0824
  • charlene0824
  • 2016年05月12日 20:11
  • 5711

六大排序(选择,插入,冒泡,希尔,快排,堆排序)

1.实现简单选择排序、直接插入排序和冒泡排序。 2.实现希尔排序算法。 3.实现快速排序算法。 4.实现堆排序算法。 想想这么多排序方法,乍一看挺复杂,写起来还挺简单的…… #include #i...
  • martinue
  • martinue
  • 2016年06月14日 18:17
  • 900

java常用三种排序算法---(插入,冒泡,顺序)及其时间复杂度

java三种排序算法 1.插入排序 插入排序,稳定(改变一部分数组数值的位置)(时间最坏复杂度 O(n^2)最优均为O(n)) 插入排序的算法核心为把当前插入的位置之前变为有序 2.冒泡排序 冒泡排...
  • bestxianfeng163
  • bestxianfeng163
  • 2017年08月04日 16:19
  • 375

冒泡/选择/插入排序区别

在上篇转载的博客,通过那些图,相信已经让你对于这三种算法有了一定的了解,下面首先来回顾下各种排序的主要思路: 冒泡排序:     每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面,逐次比...
  • kwy15732621629
  • kwy15732621629
  • 2016年05月01日 15:21
  • 1602

常用排序算法——冒泡、插入、选择

冒泡排序法是初学者最早接触的排序法,实现比较简单,代码如下:#include void bubble_sort(int *array, int len){ for(int i = 1; i...
  • girlkoo
  • girlkoo
  • 2013年12月27日 10:05
  • 4405
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java (冒泡、选择、插入)排序
举报原因:
原因补充:

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