冒泡排序的原理:
創(chuàng)新互聯(lián)為您提適合企業(yè)的網(wǎng)站設(shè)計(jì)?讓您的網(wǎng)站在搜索引擎具有高度排名,讓您的網(wǎng)站具備超強(qiáng)的網(wǎng)絡(luò)競(jìng)爭(zhēng)力!結(jié)合企業(yè)自身,進(jìn)行網(wǎng)站設(shè)計(jì)及把握,最后結(jié)合企業(yè)文化和具體宗旨等,才能創(chuàng)作出一份性化解決方案。從網(wǎng)站策劃到成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì), 我們的網(wǎng)頁(yè)設(shè)計(jì)師為您提供的解決方案。
從第一個(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)的嵌套。
冒泡排序的英文Bubble Sort,是一種最基礎(chǔ)的交換排序。
大家一定都喝過汽水,汽水中常常有許多小小的氣泡,嘩啦嘩啦飄到上面來。這是因?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ì)越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。
具體如何來移動(dòng)呢?讓我們來看一個(gè)栗子:
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
有8個(gè)數(shù)組成一個(gè)無(wú)序數(shù)列:5,8,6,3,9,2,1,7,希望從小到大排序。按照冒泡排序的思想,我們要把相鄰的元素兩兩比較,根據(jù)大小來交換元素的位置,過程如下:
首先讓5和8比較,發(fā)現(xiàn)5比8要小,因此元素位置不變。
接下來讓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要小,所以元素位置不變。
接下來讓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)擊輸入圖片描述
接下來讓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)擊輸入圖片描述
這樣一來,元素9作為數(shù)列的最大元素,就像是汽水里的小氣泡一樣漂啊漂,漂到了最右側(cè)。
這時(shí)候,我們的冒泡排序的第一輪結(jié)束了。數(shù)列最右側(cè)的元素9可以認(rèn)為是一個(gè)有序區(qū)域,有序區(qū)域目前只有一個(gè)元素。
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
下面,讓我們來進(jìn)行第二輪排序:
首先讓5和6比較,發(fā)現(xiàn)5比6要小,因此元素位置不變。
接下來讓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要小,因此元素位置不變。
接下來讓8和2比較,發(fā)現(xiàn)8比2要大,所以8和2交換位置。
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
接下來讓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ì)您有所幫助!~
冒泡排序是比較經(jīng)典的排序算法。代碼如下:
for(int i=1;iarr.length;i++){
for(int j=1;jarr.length-i;j++){
//交換位置
} ? ?
拓展資料:
原理:比較兩個(gè)相鄰的元素,將值大的元素交換至右端。
思路:依次比較相鄰的兩個(gè)數(shù),將小數(shù)放在前面,大數(shù)放在后面。即在第一趟:首先比較第1個(gè)和第2個(gè)數(shù),將小數(shù)放前,大數(shù)放后。然后比較第2個(gè)數(shù)和第3個(gè)數(shù),將小數(shù)放前,大數(shù)放后,如此繼續(xù),直至比較最后兩個(gè)數(shù),將小數(shù)放前,大數(shù)放后。重復(fù)第一趟步驟,直至全部排序完成。
第一趟比較完成后,最后一個(gè)數(shù)一定是數(shù)組中最大的一個(gè)數(shù),所以第二趟比較的時(shí)候最后一個(gè)數(shù)不參與比較;
第二趟比較完成后,倒數(shù)第二個(gè)數(shù)也一定是數(shù)組中第二大的數(shù),所以第三趟比較的時(shí)候最后兩個(gè)數(shù)不參與比較;
依次類推,每一趟比較次數(shù)-1;
??
舉例說明:要排序數(shù)組:int[]?arr={6,3,8,2,9,1};?
for(int i=1;iarr.length;i++){
for(int j=1;jarr.length-i;j++){
//交換位置
} ? ?
參考資料:冒泡排序原理
int
array[]=new
int[]{9,2,3,1,0,5,8,4,7,6};//初始化一個(gè)數(shù)組,長(zhǎng)度為10
int
temp;//定義一個(gè)臨時(shí)變量,
System.out.println("原有數(shù)組內(nèi)容:");//輸出這幾個(gè)漢字
printArray(array);//調(diào)用printArray方法,并將前面初始化的數(shù)組作為參數(shù)傳遞給該方法
for(int
i
=1;iarray.length;i++){//這里應(yīng)該是算法的核心了,但是如果想理解,還是先看看內(nèi)層的循環(huán),
for(int
j
=0;jarray.length-i;j++){//循環(huán)了0到數(shù)組長(zhǎng)度10-1
一共10次
if(array[j]array[j+1]){//數(shù)組的第一個(gè)元素a[0]與第二個(gè)元素a[1]做比較,如果大于,第2個(gè)元素
temp=array[j];//那么將大的那個(gè)值a[0]的值賦值給臨時(shí)變量
array[j]=array[j+1];//再將a[1]的值賦值給a[0]
array[j+1]=temp;//最后把臨時(shí)變量中的值復(fù)制給a[1]
//看懂這里了嗎?如果前面的數(shù),或者形象點(diǎn)a[0]
,a[1],..依次往上排,那么就是如果排在下面的數(shù)組元素的值大于上面的數(shù)組元素的值那么就將這兩個(gè)元素的位置換一下,大的放上面,也就是排在數(shù)組的后面,像不像冒泡,水中的氣泡,越到上面越大;如果小的話當(dāng)然就沒關(guān)系了,還是小的在下面
}
//這一次內(nèi)層循環(huán)做完之后,保證了最下面的氣泡(數(shù)組元素的位置),它跟后面所有的元素都做了一次比較,如果它最大就能排到最上面
}
//最外層的循環(huán)保證了,從頭到尾將所有的數(shù)組元素按照從前到后,或者從下到上的順序都與后面的元素比較了一次,這就完成了所有元素的排序
}
System.out.println("從小到大排序后的結(jié)果:");
printArray(array);
}
private
static
void
printArray(int[]
array)
{//來看看,這個(gè)方法做了什么,在上面調(diào)用這個(gè)方法的時(shí)候已經(jīng)將你初始化的那個(gè)長(zhǎng)度為10的數(shù)組做為參數(shù)傳遞了進(jìn)來
//
TODO
Auto-generated
method
stub
for(int
i
:
array){//用增強(qiáng)for循環(huán),遍歷這個(gè)數(shù)組
System.out.print(i+"
");//一次打印i的值和空格
}
System.out.println("\n");//都遍歷結(jié)束后,換行
}
輸入內(nèi)容已經(jīng)達(dá)到長(zhǎng)度限制
還能輸入
9999
字
希望你滿意,遇到問題多多分析!
首先無(wú)論是哪種語(yǔ)言,各種排序的算法思想都是一樣的。
冒泡排序的算法思想是:1、比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。
2、對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì)。在這一點(diǎn),最后的元素應(yīng)該會(huì)是最大的數(shù)。3、針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。4、持續(xù)每次對(duì)越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。
代碼分析:你的代碼中外層第一次循環(huán)首先將數(shù)組中的各個(gè)元素與temp[1]比較,也就是數(shù)組中的第二個(gè)元素,內(nèi)層循環(huán)中,每次循環(huán)都會(huì)判斷,temp[1]與其他元素的大小。如果有元素的值比temp[1]大,就講他們你的值交換,使用交換后的值繼續(xù)依次與未經(jīng)比較的值進(jìn)行比較,直到與所有的元素比較完,這是第一趟排序。第一趟排序中,外層循環(huán)只執(zhí)行了一次,內(nèi)層循環(huán)每比較一次,循環(huán)一次,所以內(nèi)層循環(huán)執(zhí)行了temp.length次。第一趟排序找出了數(shù)組中最大的數(shù),放在數(shù)組的最后一位置。。。依此類推,第二趟排序找出第二大的數(shù)放在倒數(shù)第二的位置。其后的每一次循環(huán)以此類推。