重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
/*
网站建设哪家好,找成都创新互联!专注于网页设计、网站建设、微信开发、小程序制作、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了荥阳免费建站欢迎大家使用!
首先我们要先了解冒泡排序的原理!
冒泡排序:
每一轮选择两个相邻数据进行比较,满足条件交换位置,每一轮确定一个数的最终位置(这里我们假设从小到大排,那么每轮就是确定最大一个数的位置)
*/
public static void maoPao(int []arr)
{
//外层循环,控制比较的轮数。arr.length-1:比较的轮数永远比数组的长度少1(例如,3个数我们比较两次就能知道最大值是谁,4个数比较3次,5个四次,以此类推)
for(int i=0;iarr.length-1;i++)
{
//内层循环控制每一轮比较的次数。arr.length-1-i:下一轮比较次数比上一轮少1(通过分析我们不难得出,第一轮比较arr.length-1次(此时i=0),第二轮比较arr.length-1-1(此时i=1),一次类推,每轮减少比较的次数正好就是i的值,所以内层循环比较次数为arr.length-1-i)
for(int j=0;jarr.length-1-i;j++)
{
//相邻的两个元素进行比较,满足条件交换位置
if(arr[j]arr[j+1])
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
/*
下边是一张比较图,对数组[34,456,67,78,34,23,67]进行冒泡排序
第一轮,通过比较,相邻交换,我们确定了最大值456的位置,那么第二轮456就不用再参与比较了;
以此类推,最后一轮正好比较第一个和第二个的位置,这样就最终确定了整个数组元素的大小顺序。
而这个比较过程就像在水中放一堆小球,越重的就越靠近水底,越轻的就越靠近水面一样,整个过程交换并排序的过程就像是水中的气泡从底向上溢的过程,所以称作冒泡排序。
最后,总结一点,所有涉及for循环排序的题目,都记住一句话:外层循环控制比较轮数(所有元素比较一遍,称为一轮),内层循环控每轮比较的次数。我们所要做的就是建立好外层循环和内层循环之间的关系(就像这里的i一样,内外层循环共用了,但它在内外层循环的作用是不一样的)
冒泡排序的英文Bubble Sort,是一种最基础的交换排序。
大家一定都喝过汽水,汽水中常常有许多小小的气泡,哗啦哗啦飘到上面来。这是因为组成小气泡的二氧化碳比水要轻,所以小气泡可以一点一点向上浮动。而我们的冒泡排序之所以叫做冒泡排序,正是因为这种排序算法的每一个元素都可以像小气泡一样,根据自身大小,一点一点向着数组的一侧移动。
冒泡排序算法的原理如下:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
具体如何来移动呢?让我们来看一个栗子:
请点击输入图片描述
请点击输入图片描述
有8个数组成一个无序数列:5,8,6,3,9,2,1,7,希望从小到大排序。按照冒泡排序的思想,我们要把相邻的元素两两比较,根据大小来交换元素的位置,过程如下:
首先让5和8比较,发现5比8要小,因此元素位置不变。
接下来让8和6比较,发现8比6要大,所以8和6交换位置。
请点击输入图片描述
请点击输入图片描述
请点击输入图片描述
请点击输入图片描述
继续让8和3比较,发现8比3要大,所以8和3交换位置。
请点击输入图片描述
请点击输入图片描述
请点击输入图片描述
请点击输入图片描述
继续让8和9比较,发现8比9要小,所以元素位置不变。
接下来让9和2比较,发现9比2要大,所以9和2交换位置。
请点击输入图片描述
请点击输入图片描述
请点击输入图片描述
请点击输入图片描述
接下来让9和1比较,发现9比1要大,所以9和1交换位置。
请点击输入图片描述
请点击输入图片描述
请点击输入图片描述
请点击输入图片描述
最后让9和7比较,发现9比7要大,所以9和7交换位置。
请点击输入图片描述
请点击输入图片描述
请点击输入图片描述
请点击输入图片描述
这样一来,元素9作为数列的最大元素,就像是汽水里的小气泡一样漂啊漂,漂到了最右侧。
这时候,我们的冒泡排序的第一轮结束了。数列最右侧的元素9可以认为是一个有序区域,有序区域目前只有一个元素。
请点击输入图片描述
请点击输入图片描述
下面,让我们来进行第二轮排序:
首先让5和6比较,发现5比6要小,因此元素位置不变。
接下来让6和3比较,发现6比3要大,所以6和3交换位置。
请点击输入图片描述
请点击输入图片描述
请点击输入图片描述
请点击输入图片描述
继续让6和8比较,发现6比8要小,因此元素位置不变。
接下来让8和2比较,发现8比2要大,所以8和2交换位置。
请点击输入图片描述
请点击输入图片描述
接下来让8和1比较,发现8比1要大,所以8和1交换位置。
请点击输入图片描述
请点击输入图片描述
请点击输入图片描述
请点击输入图片描述
继续让8和7比较,发现8比7要大,所以8和7交换位置。
请点击输入图片描述
请点击输入图片描述
请点击输入图片描述
请点击输入图片描述
第二轮排序结束后,我们数列右侧的有序区有了两个元素,顺序如下:
请点击输入图片描述
请点击输入图片描述
至于后续的交换细节,我们这里就不详细描述了,第三轮过后的状态如下:
请点击输入图片描述
请点击输入图片描述
第四轮过后状态如下:
请点击输入图片描述
请点击输入图片描述
第五轮过后状态如下:
请点击输入图片描述
请点击输入图片描述
第六轮过后状态如下:
请点击输入图片描述
请点击输入图片描述
第七轮过后状态如下(已经是有序了,所以没有改变):
请点击输入图片描述
请点击输入图片描述
第八轮过后状态如下(同样没有改变):
请点击输入图片描述
请点击输入图片描述
到此为止,所有元素都是有序的了,这就是冒泡排序的整体思路。
原始的冒泡排序是稳定排序。由于该排序算法的每一轮要遍历所有元素,轮转的次数和元素数量相当,所以时间复杂度是O(N^2) 。
冒泡排序代码
请点击输入图片描述
请点击输入图片描述
希望对您有所帮助!~
冒泡排序的原理:
从第一个元素开始,将相邻的两个元素依次进行比较,直到最后两个元素完成比较。如果前一个元素比后一个元素大,则交换它们的位置。整个过程完成后最后一个元素就是最大值,完成第一轮比较,后边通过for循环依次完成后续比较。
运行代码如下:
package day01;
public class 冒泡 {
public static void main(String[] args) {
int []arr=new int[] {12,45,33,46,3};
System.out.println("排序之前的元素顺序:");
for(int i=0;iarr.length;i++)
{
System.out.print(arr[i]+" ");
}
int t;
for(int j=0;jarr.length-1;j++)
{
for(int x=0;xarr.length-1;x++)
{
if(arr[x]arr[x+1])
{
t=arr[x];
arr[x]=arr[x+1];
arr[x+1]=t;
}
}
}
System.out.println();
System.out.println("排序之后的元素顺序:");
for(int k=0;karr.length;k++)
{
System.out.print(arr[k]+" ");
}
}
}
运行结果截图:
扩展资料:
(1)冒泡排序每一轮把一个最大的元素放在数组的最后
(2)如果想要实现倒叙比较输出可以把代码判断大小的部分改为下边代码即可。
if(arr[x]arr[x+1])
{
t=arr[x];
arr[x]=arr[x+1];
arr[x+1]=t;
}
(3)使用知识点:数组length的使用,数组的定义,for循环的嵌套。
冒泡排序是所欲排序算法里最好理解的了。
1、排序算法:
A)比较相邻的元素。如果第一个比第二个大,就交换他们两个。
B)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
C)针对所有的元素重复以上的步骤,除了最后一个。
D)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
2、给你一个java的实现代码:
public class BubbleSort{
public static void main(String[] args){
int score[] = {67, 69, 75, 87, 89, 90, 99, 100};
for (int i = 0; i score.length -1; i++){ //最多做n-1趟排序
for(int j = 0 ;j score.length - i - 1; j++){ //对当前无序区间score[0......length-i-1]进行排序(j的范围很关键,这个范围是在逐步缩小的)
if(score[j] score[j + 1]){ //把小的值交换到后面
int temp = score[j];
score[j] = score[j + 1];
score[j + 1] = temp;
}
}
System.out.print("第" + (i + 1) + "次排序结果:");
for(int a = 0; a score.length; a++){
System.out.print(score[a] + "\t");
}
System.out.println("");
}
System.out.print("最终排序结果:");
for(int a = 0; a score.length; a++){
System.out.print(score[a] + "\t");
}
}
}
方法一:
package
basic.javastu;
public
class
NumberTest
{
/**
*
实现冒泡程序1
*/
public
static
void
main(String[]
args)
{
//
TODO
Auto-generated
method
stub
int[]
numb=new
int[]{3,42,57,1,32,24};
int
len=numb.length;
int
i,j;
int
temp;
System.out.println("排序前的数组各个值:");
for(i=0;ilen;i++)
{
System.out.print(numb[i]+"\t");
}
System.out.println("\n");
for(i=1;i=len;i++)
{
for(j=len-1;j=1;j--)
{
if(numb[j]numb[j-1])
{
temp=numb[j];
numb[j]=numb[j-1];
numb[j-1]=temp;
}
}
}
System.out.println("排序后的数组各个值:");
for(i=0;ilen;i++)
{
System.out.print(numb[i]+"\t");
}
}
}
方法二:
package
basic.javastu;
public
class
NumberTest2
{
/**
*
实现冒泡程序2
*/
public
static
void
main(String[]
args)
{
//
TODO
Auto-generated
method
stub
int[]
numb=new
int[]{3,42,57,1,32,24};
int
leng=numb.length;
System.out.println("排序前的数组各个值:");
for(int
i=0;ileng;i++)
{
System.out.print(numb[i]+"\t");
}
System.out.println("\n");
swap(numb);
System.out.println("数组排序后:");
for(int
i=0;ileng;i++)
{
System.out.print(numb[i]+"\t");
}
}
private
static
int[]
swap(int[]
numb)
{
int
n2[]=numb;
int
len=n2.length;
int
i,j;
int
temp;
for(i=1;i=len;i++)
{
for(j=len-1;j=1;j--)
{
if(n2[j]n2[j-1])
{
temp=n2[j];
n2[j]=n2[j-1];
n2[j-1]=temp;
}
}
}
return
n2;
}
}
方法三:
package
basic.javastu;
public
class
NumberTest3
{
/**
*
实现冒泡程序2
*/
public
static
void
main(String[]
args)
{
//
TODO
Auto-generated
method
stub
int[]
numb=new
int[]{3,42,57,1,32,24};
int
leng=numb.length;
System.out.println("排序前的数组各个值:");
for(int
i=0;ileng;i++)
{
System.out.print(numb[i]+"\t");
}
System.out.println("\n");
swap(numb);
System.out.println("数组排序后:");
for(int
i=0;ileng;i++)
{
System.out.print(numb[i]+"\t");
}
}
private
static
void
swap(int[]
numb)
{
int
len=numb.length;
int
i,j;
int
temp;
for(i=1;i=len;i++)
{
for(j=len-1;j=1;j--)
{
if(numb[j]numb[j-1])
{
temp=numb[j];
numb[j]=numb[j-1];
numb[j-1]=temp;
}
}
}
}
}