冒泡排序

上篇文章讲解了最简单的一种排序方式 —— 桶排序, 桶排序具有诸多就弊端,其中最大的缺点是极其浪费空间。例如,如果需要将十万个数进行排列则需要准备十万个实际操作的变量。因此桶排序对空间的浪费是极其严重的。其次,桶排序能解决的排序问题,其数据类型只能是整型数据。下面这种新的排序方式叫做冒泡排序!他能够较好的解决这两种问题。

一、介绍

开发语言:JavaScript
开发工具:HBuilder
开发日期:2019-10-18
作者:CodingNAN

二、算法设计

冒泡排序的基本思想:从一组数据的第一个数据开始,每次比较相邻的两个数据,如果顺序错误则交换位置。
(1)初始化数据

首先定义一个大小为101的数组var arr = [101] 。此时数组中已经储存了101个变量,编写号从arr[0]~arr[100]

var arr = [101];
var i,j,k,n;
/* 循环输入分数 初始化数据*/
n = prompt("输入一个n代表将输入的分数总个数");
for(i = 1; i <= n; i++){
	arr[i] = prompt("输入第"+i+"个分数");
}
for(i = 1; i <= n; i++){
	console.log("输入的第"+i+"个分数为:"+arr[i]);	// 显示输入的原始数据
}
下面是控制台显示,通过prompt方法循环写入和输出的原始数据。
⑴ 输入n,代表要输入的数据总数

在这里插入图片描述

⑵ 依次输入具体数据

在这里插入图片描述

⑶ 显示原始数据

在这里插入图片描述

(2)冒泡排序的核心部分

冒泡排序的核心部分操作主要为两部分组成:一是双重嵌套 for 循环使用,二是内层循环 if条件判断通过比较相邻的两个数据,判断顺序是否正确。

核心代码:
/* 冒泡排序核心部分 双重for循环 if判断交换位置 */
for(i = 1; i <= n - 1; i++){
	for(j = 1; j <= n - i; j++){
		if(arr[j] < arr[j+1]){
			k = arr[j];
			arr[j] = arr[j+1];	// 交换方式
			arr[j+1] = k;
		}
	}
}
for(i = 1; i <= n; i++){
	console.log(arr[i]);
}
具体操作:

首先我们输入 n 的个数为10,即 n = 10;
输入的原始数据为:23 11 44 55 66 99 56 35 87 92 ;
现在开始进入循环体:

外层 for 循环 i = 1,i <= 9,
① 进入内层for循环 j = 1,j <= 9,此时第一个数为 arr[ j ] = arr[ 1 ] = 23,第二个数即是 arr[ j+1 ] = arr[ 2 ] = 11,if判断两者不交换位置,数组值仍是:arr[ 1 ] = 23,arr[2] = 11, 判断结束, j++;
② 继续内层for循环 j = 2,j <= 9, 此时第二个数为 arr[ j ] = arr[ 2 ] = 11,第三个数即是 arr[ j+1 ] = arr[ 3 ] = 44,if判断两者需交换位置,数组值即变为:arr [ 2 ] = 44,a [ 3 ] = 11,判断结束,j++;
③ 继续内层for循环 j = 3,j <= 9,此时第三个数为 arr[ j ] = arr[ 3 ] = 11,第四个数即是 arr[ j+1 ] = arr[ 4 ] = 55,if判断两者需交换位置,数组值即变为:arr[ 3 ] = 44,arr[ 4 ] = 11,,判断结束,j++;
④ ~~~~~~ ⑨ 依次循环判断;

最终得出在外层 for 循环 i 为 1 前提下,第一轮循环排序结果为 23 44 55 66 99 56 35 87 92 11

此时进入第二轮外层 for 循环 i = 2,i <= 9,注意:此时进入内层 for 循环 j = 1; j <= n - 2; 即 J <= 8,完成8次内层 for 循环,输出的第二轮排序结果。

第二轮排序结果为:44 55 66 99 56 35 87 92 23 11

接下来的操作即是外层 for 循环 i = 3 ,内层 for 循环 j <= 7;完成7次内层 for 循环输出第三轮排序结果。

第三轮排序结果为:55 66 99 56 44 87 92 35 23 11
重复执行以上双层嵌套循环操作
第四轮排序结果为:66 99 56 55 87 92 44 35 23 11
第五轮排序结果为:99 66 56 87 92 55 44 35 23 11
第六轮排序结果为:99 66 87 92 56 55 44 35 23 11
第七轮排序结果为:99 87 92 66 56 55 44 35 23 11
第八轮排序结果为:99 92 87 66 56 55 44 35 23 11
第九轮排序结果为:99 92 87 66 56 55 44 35 23 11 双重循环结束;

即可得出最终排序结果:99 92 81 66 56 55 44 35 23 11
排序结果显示

在这里插入图片描述

三、总结

冒泡排序的核心部分是双重嵌套循环,其时间复杂度为 O(N*N) 即O(N²)。这是一个非常高的时间复杂度!对于海量数据的排序效其率的弊端明显。时间上花费太大了。那么有没有既不浪费时间又节省空间的排序算法呢?下一遍博客将为各位介绍这种方法——快速排序!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值