/*
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了滎陽(yáng)免費(fèi)建站歡迎大家使用!
首先我們要先了解冒泡排序的原理!
冒泡排序:
每一輪選擇兩個(gè)相鄰數(shù)據(jù)進(jìn)行比較,滿足條件交換位置,每一輪確定一個(gè)數(shù)的最終位置(這里我們假設(shè)從小到大排,那么每輪就是確定最大一個(gè)數(shù)的位置)
*/
public static void maoPao(int []arr)
{
//外層循環(huán),控制比較的輪數(shù)。arr.length-1:比較的輪數(shù)永遠(yuǎn)比數(shù)組的長(zhǎng)度少1(例如,3個(gè)數(shù)我們比較兩次就能知道最大值是誰(shuí),4個(gè)數(shù)比較3次,5個(gè)四次,以此類推)
for(int i=0;iarr.length-1;i++)
? ?{
//內(nèi)層循環(huán)控制每一輪比較的次數(shù)。arr.length-1-i:下一輪比較次數(shù)比上一輪少1(通過分析我們不難得出,第一輪比較arr.length-1次(此時(shí)i=0),第二輪比較arr.length-1-1(此時(shí)i=1),一次類推,每輪減少比較的次數(shù)正好就是i的值,所以內(nèi)層循環(huán)比較次數(shù)為arr.length-1-i)
for(int j=0;jarr.length-1-i;j++)
{
? ?//相鄰的兩個(gè)元素進(jìn)行比較,滿足條件交換位置
if(arr[j]arr[j+1])
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
??}
}
/*
下邊是一張比較圖,對(duì)數(shù)組[34,456,67,78,34,23,67]進(jìn)行冒泡排序
第一輪,通過比較,相鄰交換,我們確定了最大值456的位置,那么第二輪456就不用再參與比較了;
以此類推,最后一輪正好比較第一個(gè)和第二個(gè)的位置,這樣就最終確定了整個(gè)數(shù)組元素的大小順序。
而這個(gè)比較過程就像在水中放一堆小球,越重的就越靠近水底,越輕的就越靠近水面一樣,整個(gè)過程交換并排序的過程就像是水中的氣泡從底向上溢的過程,所以稱作冒泡排序。
最后,總結(jié)一點(diǎn),所有涉及for循環(huán)排序的題目,都記住一句話:外層循環(huán)控制比較輪數(shù)(所有元素比較一遍,稱為一輪),內(nèi)層循環(huán)控每輪比較的次數(shù)。我們所要做的就是建立好外層循環(huán)和內(nèi)層循環(huán)之間的關(guān)系(就像這里的i一樣,內(nèi)外層循環(huán)共用了,但它在內(nèi)外層循環(huán)的作用是不一樣的)
冒泡排序的英文Bubble Sort,是一種最基礎(chǔ)的交換排序。
大家一定都喝過汽水,汽水中常常有許多小小的氣泡,嘩啦嘩啦飄到上面來(lái)。這是因?yàn)榻M成小氣泡的二氧化碳比水要輕,所以小氣泡可以一點(diǎn)一點(diǎn)向上浮動(dòng)。而我們的冒泡排序之所以叫做冒泡排序,正是因?yàn)檫@種排序算法的每一個(gè)元素都可以像小氣泡一樣,根據(jù)自身大小,一點(diǎn)一點(diǎn)向著數(shù)組的一側(cè)移動(dòng)。
冒泡排序算法的原理如下:
比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。
對(duì)每一對(duì)相鄰元素做同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì)。在這一點(diǎn),最后的元素應(yīng)該會(huì)是最大的數(shù)。
針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。
持續(xù)每次對(duì)越來(lái)越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。
具體如何來(lái)移動(dòng)呢?讓我們來(lái)看一個(gè)栗子:
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
有8個(gè)數(shù)組成一個(gè)無(wú)序數(shù)列:5,8,6,3,9,2,1,7,希望從小到大排序。按照冒泡排序的思想,我們要把相鄰的元素兩兩比較,根據(jù)大小來(lái)交換元素的位置,過程如下:
首先讓5和8比較,發(fā)現(xiàn)5比8要小,因此元素位置不變。
接下來(lái)讓8和6比較,發(fā)現(xiàn)8比6要大,所以8和6交換位置。
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
繼續(xù)讓8和3比較,發(fā)現(xiàn)8比3要大,所以8和3交換位置。
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
繼續(xù)讓8和9比較,發(fā)現(xiàn)8比9要小,所以元素位置不變。
接下來(lái)讓9和2比較,發(fā)現(xiàn)9比2要大,所以9和2交換位置。
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
接下來(lái)讓9和1比較,發(fā)現(xiàn)9比1要大,所以9和1交換位置。
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
最后讓9和7比較,發(fā)現(xiàn)9比7要大,所以9和7交換位置。
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
這樣一來(lái),元素9作為數(shù)列的最大元素,就像是汽水里的小氣泡一樣漂啊漂,漂到了最右側(cè)。
這時(shí)候,我們的冒泡排序的第一輪結(jié)束了。數(shù)列最右側(cè)的元素9可以認(rèn)為是一個(gè)有序區(qū)域,有序區(qū)域目前只有一個(gè)元素。
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
下面,讓我們來(lái)進(jìn)行第二輪排序:
首先讓5和6比較,發(fā)現(xiàn)5比6要小,因此元素位置不變。
接下來(lái)讓6和3比較,發(fā)現(xiàn)6比3要大,所以6和3交換位置。
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
繼續(xù)讓6和8比較,發(fā)現(xiàn)6比8要小,因此元素位置不變。
接下來(lái)讓8和2比較,發(fā)現(xiàn)8比2要大,所以8和2交換位置。
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
接下來(lái)讓8和1比較,發(fā)現(xiàn)8比1要大,所以8和1交換位置。
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
繼續(xù)讓8和7比較,發(fā)現(xiàn)8比7要大,所以8和7交換位置。
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
第二輪排序結(jié)束后,我們數(shù)列右側(cè)的有序區(qū)有了兩個(gè)元素,順序如下:
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
至于后續(xù)的交換細(xì)節(jié),我們這里就不詳細(xì)描述了,第三輪過后的狀態(tài)如下:
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
第四輪過后狀態(tài)如下:
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
第五輪過后狀態(tài)如下:
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
第六輪過后狀態(tài)如下:
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
第七輪過后狀態(tài)如下(已經(jīng)是有序了,所以沒有改變):
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
第八輪過后狀態(tài)如下(同樣沒有改變):
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
到此為止,所有元素都是有序的了,這就是冒泡排序的整體思路。
原始的冒泡排序是穩(wěn)定排序。由于該排序算法的每一輪要遍歷所有元素,輪轉(zhuǎn)的次數(shù)和元素?cái)?shù)量相當(dāng),所以時(shí)間復(fù)雜度是O(N^2) 。
冒泡排序代碼
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
希望對(duì)您有所幫助!~
冒泡排序的原理:
從第一個(gè)元素開始,將相鄰的兩個(gè)元素依次進(jìn)行比較,直到最后兩個(gè)元素完成比較。如果前一個(gè)元素比后一個(gè)元素大,則交換它們的位置。整個(gè)過程完成后最后一個(gè)元素就是最大值,完成第一輪比較,后邊通過for循環(huán)依次完成后續(xù)比較。
運(yùn)行代碼如下:
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]+" ");
}
}
}
運(yùn)行結(jié)果截圖:
擴(kuò)展資料:
(1)冒泡排序每一輪把一個(gè)最大的元素放在數(shù)組的最后
(2)如果想要實(shí)現(xiàn)倒敘比較輸出可以把代碼判斷大小的部分改為下邊代碼即可。
if(arr[x]arr[x+1])
{
t=arr[x];
arr[x]=arr[x+1];
arr[x+1]=t;
}
(3)使用知識(shí)點(diǎn):數(shù)組length的使用,數(shù)組的定義,for循環(huán)的嵌套。
冒泡排序是所欲排序算法里最好理解的了。
1、排序算法:
A)比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。
B)對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì)。在這一點(diǎn),最后的元素應(yīng)該會(huì)是最大的數(shù)。
C)針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。
D)持續(xù)每次對(duì)越來(lái)越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。
2、給你一個(gè)java的實(shí)現(xiàn)代碼:
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++){ //對(duì)當(dāng)前無(wú)序區(qū)間score[0......length-i-1]進(jìn)行排序(j的范圍很關(guān)鍵,這個(gè)范圍是在逐步縮小的)
? ? ? ? ? ?if(score[j] score[j + 1]){ //把小的值交換到后面
? ? ? ? ? ? ? ?int temp = score[j];
? ? ? ? ? ? ? ?score[j] = score[j + 1];
? ? ? ? ? ? ? ?score[j + 1] = temp;
? ? ? ? ? ?}
? ? ? ?}
? ? ? ?System.out.print("第" + (i + 1) + "次排序結(jié)果:");
? ? ? ?for(int a = 0; a score.length; a++){
? ? ? ? ? ?System.out.print(score[a] + "\t");
? ? ? ?}
? ? ? ?System.out.println("");
? ?}
? ? ? ?System.out.print("最終排序結(jié)果:");
? ? ? ?for(int a = 0; a score.length; a++){
? ? ? ? ? ?System.out.print(score[a] + "\t");
? }
}
}
方法一:
package
basic.javastu;
public
class
NumberTest
{
/**
*
實(shí)現(xiàn)冒泡程序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("排序前的數(shù)組各個(gè)值:");
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("排序后的數(shù)組各個(gè)值:");
for(i=0;ilen;i++)
{
System.out.print(numb[i]+"\t");
}
}
}
方法二:
package
basic.javastu;
public
class
NumberTest2
{
/**
*
實(shí)現(xiàn)冒泡程序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("排序前的數(shù)組各個(gè)值:");
for(int
i=0;ileng;i++)
{
System.out.print(numb[i]+"\t");
}
System.out.println("\n");
swap(numb);
System.out.println("數(shù)組排序后:");
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
{
/**
*
實(shí)現(xiàn)冒泡程序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("排序前的數(shù)組各個(gè)值:");
for(int
i=0;ileng;i++)
{
System.out.print(numb[i]+"\t");
}
System.out.println("\n");
swap(numb);
System.out.println("數(shù)組排序后:");
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;
}
}
}
}
}
分享題目:java冒泡排序原理代碼,java冒泡排序代碼及解釋
標(biāo)題路徑:http://www.rwnh.cn/article26/dsijojg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、小程序開發(fā)、軟件開發(fā)、虛擬主機(jī)、電子商務(wù)、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)