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