数据结构和算法-002 数组排序 冒泡排序

冒泡排序

1算法原理

1. 冒泡排序算法的运作如下:(从后往前)

  1. 2. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 3. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 4. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 5. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

2算法分析

时间复杂度

若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数 和记录移动次数  均达到最小值: ,

所以,冒泡排序最好的时间复杂度为 

若初始文件是反序的,需要进行  趟排序。每趟排序要进行  次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:

冒泡排序的最坏时间复杂度为

综上,因此冒泡排序总的平均时间复杂度为

算法稳定性

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

Note:参考百度百科 http://baike.baidu.com/view/254413.htm

看代码

public class ArrayStructures {

	private int[] theArray = new int[50];

	private int arraySize = 10;

	public void generateRandomArray(){
		for (int i =0; i< arraySize;i++){
			theArray[i] = (int)(Math.random()*10 + 10);
		}
	}

	public void printArray(){
		StringBuffer sb = new StringBuffer("-");
		for (int i = 0; i<arraySize; i++){
			sb.append("-----");
		}

		String septalLine= sb.toString();

		System.out.println(septalLine);
		for (int i = 0; i<arraySize; i++){
			System.out.print("|  " + i + " ");
		}
		System.out.println("|");
		System.out.println(septalLine);
		for (int i = 0; i<arraySize; i++){
			System.out.print("| " + theArray[i] + " ");
		}
		System.out.println("|");
		System.out.println(septalLine);
	}

	public void bubbleSort(){
		for (int i=arraySize-1; i>0; i--){
			for(int j=0; j<i; j++)
				if(theArray[j]>theArray[j+1]){
					swapValues(j,j+1);
				}
		}
	}

	public void swapValues(int valueOne, int valueTwo){
		int temp = theArray[valueOne];
		theArray[valueOne]= theArray[valueTwo];
		theArray[valueTwo]=temp;
	}

	public static void main(String[] args) {
		// Generate an Array 
		System.out.println("Create an array, and fill in random value");
		ArrayStructures as = new ArrayStructures();
		// Set Random value in Array 
		as.generateRandomArray();
		// Print original array 
		as.printArray();
		System.out.println();

		System.out.println("Bubble Sort");
		as.bubbleSort();
		as.printArray();
		System.out.println();

	}
}

输出结果

Create an array, and fill in random value
---------------------------------------------------
|  0 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 |
---------------------------------------------------
| 18 | 15 | 16 | 14 | 11 | 13 | 19 | 14 | 13 | 10 |
---------------------------------------------------

Bubble Sort
---------------------------------------------------
|  0 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 |
---------------------------------------------------
| 10 | 11 | 13 | 13 | 14 | 14 | 15 | 16 | 18 | 19 |
---------------------------------------------------
时间: 2024-10-01 03:02:17

数据结构和算法-002 数组排序 冒泡排序的相关文章

JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序

1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习. 之所以把冒泡排序.选择排序.插入排序放在一起比较,是因为它们的平均时间复杂度都为 O(n2). 请大家带着问题:为什么插入排序比冒泡排序更受欢迎 ?来阅读下文. 2. 如何分析一个排序算法 复杂度分析是整个算法学习的精髓. 时间复杂度: 一个算法执行所耗费的时间. 空间复杂度:

Hark的数据结构与算法练习之冒泡排序

算法说明: 冒泡排序实际上是使用的最多的排序,逻辑是循环然后对相邻的数字进行比较,并交换数据. 例如有一个数组int[] arrayData = { 2, 3, 1, 5, 6, 7, 4, 65, 42 },一共9个元素. 假设我们要做降序排序,那么首先全部9个元素从第1个元素开始进行两两比较,把小的元素放到后边:元素1小于元素2,那么元素1与元素2进行交换,然后元素2与元素3进行比较,元素2大于元素3,那么不进行交换,再进行元素3与元素4的比较…………以此类推最后比较到元素9. 这时元素9已

数据结构和算法-011 数组排序 快速排序

快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 1算法介绍 快排图 设要排序的数组是A[0]--A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数

【数据结构与算法 01】冒泡排序

算法思想: 一共进行 array.size-1趟排序,每一趟排序,都将左右两个数进行比较大小,并且交换位置,这样的效果是:每一趟排序中,能找到最大的值冒泡到该趟排序的最后面,这样的话,第一趟排序,最后一个数是最大的,第二趟排序,倒数第二个数就是第二大的,最后一趟排序后 (因为最后一趟只有一个数,不用比较,所以比较次数是 array.size-1 趟),将得到有序数组 博客地址:http://blog.csdn.net/mkrcpp/article/details/39178213 import

数据结构和算法-005 数组排序 二分法检索

二分法检索 二分法检索(binary search)又称折半检索,二分法检索的基本思想是设字典中的元素从小到大有序地存放在数组(array)中, 首先将给定值key与字典中间位置上元素的关键码(key)比较,如果相等,则检索成功: 否则,若key小,则在字典前半部分中继续进行二分法检索; 若key大,则在字典后半部分中继续进行二分法检索. 这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败. 偶数个取中间2个其中任何一个作为中间元素 二分法检索是一种效率较高的检索方法,

《数据结构与算法之美》——冒泡排序、插入排序、选择排序

排序,是每一本数据结构的书都绕不开的重要部分. 排序的算法也是琳琅满目.五花八门. 每一个算法的背后都是智慧的结晶,思想精华的沉淀. 个人觉得排序算法没有绝对的孰优孰劣,用对了场景,就是最有的排序算法. 当然,撇开这些业务场景,排序算法本身有一些自己的衡量指标,比如我们经常提到的复杂度分析. 我们如何分析一个算法? 排序算法的执行效率 1.最好.最坏和平均情况的时间复杂度 2.时间复杂度的系数.常数和低阶 一般来说,在数据规模n很大的时候,可以忽略这些,但是如果我们需要排序的数据规模在几百.几千

php面试题之二——数据结构和算法(高级部分)

二.数据结构和算法 1.使对象可以像数组一样进行foreach循环,要求属性必须是私有.(Iterator模式的PHP5实现,写一类实现Iterator接口)(腾讯) <?php class Test implements Iterator{ private $item = array('id'=>1,'name'=>'php'); public function rewind(){ reset($this->item); } public function current(){

《数据结构与算法JavaScript描述》

<数据结构与算法JavaScript描述> 基本信息 作者: (美)Michael McMillan 译者: 王群锋 杜欢 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115363398 上架时间:2014-8-5 出版日期:2014 年8月 开本:16开 版次:1-1 所属分类:计算机 > 软件与程序设计 > 网络编程 > javascript 更多关于>>> <数据结构与算法JavaScript描述> 编辑推荐 随着

数据结构与算法复习(一) 排序算法(I)

这篇文章将会介绍最常见的排序算法(使用 JavaScript 语言实现) PS:这里我会尽量使用语言无关的语法去写,大家不要太在意语言,重要的是算法的实现思路 1.冒泡排序 将数组分为有序区(左边)和无序区(右边) 每次从无序区的最后一个元素开始,一直向前冒泡到无序区的第一个位置,使其变成有序 function swap(A, i, j) { if (i === j) return [A[i], A[j]] = [A[j], A[i]] } function bubbleSort(A) { fo