java 冒泡排序的三种写法_冒泡排序的三种实现(Java)
冒泡排序是非常好理解的,以從小到大排序?yàn)槔?#xff0c;每一輪排序就找出未排序序列中最大值放在最后。
設(shè)數(shù)組的長(zhǎng)度為N:
(1)比較前后相鄰的二個(gè)數(shù)據(jù),如果前面數(shù)據(jù)大于后面的數(shù)據(jù),就將這二個(gè)數(shù)據(jù)交換。
(2)這樣對(duì)數(shù)組的第0個(gè)數(shù)據(jù)到N-1個(gè)數(shù)據(jù)進(jìn)行一次遍歷后,最大的一個(gè)數(shù)據(jù)就“沉”到數(shù)組第N-1個(gè)位置。
(3)N=N-1,如果N不為0就重復(fù)前面二步,否則排序完成。
以上就是冒泡排序的基本思想,按照這個(gè)定義很快就能寫(xiě)出代碼:
/**
* 冒泡排序的第一種實(shí)現(xiàn), 沒(méi)有任何優(yōu)化
*@param a
*@param n
*/
public static void bubbleSort1(int [] a, int n){
int i, j;
for(i=0; i
for(j=1; j
if(a[j-1] > a[j]){//前面的數(shù)字大于后面的數(shù)字就交換
//交換a[j-1]和a[j]
int temp;
temp = a[j-1];
a[j-1] = a[j];
a[j]=temp;
}
}
}
}// end
給出一個(gè)測(cè)試代碼:
public static void main(String[] args) {
int[] arr = {1,1,2,0,9,3,12,7,8,3,4,65,22};
BubbleSort.bubbleSort1(arr, arr.length);
for(int i:arr){
System.out.print(i+",");
}
}
運(yùn)行結(jié)果:
0,1,1,2,3,3,4,7,8,9,12,22,65,
下面開(kāi)始考慮優(yōu)化,如果對(duì)于一個(gè)本身有序的序列,或則序列后面一大部分都是有序的序列,上面的算法就會(huì)浪費(fèi)很多的時(shí)間開(kāi)銷,這里設(shè)置一個(gè)標(biāo)志flag,如果這一趟發(fā)生了交換,則為true,否則為false。明顯如果有一趟沒(méi)有發(fā)生交換,說(shuō)明排序已經(jīng)完成。
/**
* 設(shè)置一個(gè)標(biāo)志,如果這一趟發(fā)生了交換,則為true,否則為false。明顯如果有一趟沒(méi)有發(fā)生交換,說(shuō)明排序已經(jīng)完成。
*@param a
*@param n
*/
public static void bubbleSort2(int [] a, int n){
int j, k = n;
boolean flag = true;//發(fā)生了交換就為true, 沒(méi)發(fā)生就為false,第一次判斷時(shí)必須標(biāo)志位true。
while (flag){
flag=false;//每次開(kāi)始排序前,都設(shè)置flag為未排序過(guò)
for(j=1; j
if(a[j-1] > a[j]){//前面的數(shù)字大于后面的數(shù)字就交換
//交換a[j-1]和a[j]
int temp;
temp = a[j-1];
a[j-1] = a[j];
a[j]=temp;
//表示交換過(guò)數(shù)據(jù);
flag = true;
}
}
k--;//減小一次排序的尾邊界
}//end while
}//end
運(yùn)行測(cè)試main函數(shù)結(jié)果:
0,1,1,2,3,3,4,7,8,9,12,22,65,
再進(jìn)一步做優(yōu)化。比如,現(xiàn)在有一個(gè)包含1000個(gè)數(shù)的數(shù)組,僅前面100個(gè)無(wú)序,后面900個(gè)都已排好序且都大于前面100個(gè)數(shù)字,那么在第一趟遍歷后,最后發(fā)生交換的位置必定小于100,且這個(gè)位置之后的數(shù)據(jù)必定已經(jīng)有序了,也就是這個(gè)位置以后的數(shù)據(jù)不需要再排序了,于是記錄下這位置,第二次只要從數(shù)組頭部遍歷到這個(gè)位置就可以了。如果是對(duì)于上面的冒泡排序算法2來(lái)說(shuō),雖然也只排序100次,但是前面的100次排序每次都要對(duì)后面的900個(gè)數(shù)據(jù)進(jìn)行比較,而對(duì)于現(xiàn)在的排序算法3,只需要有一次比較后面的900個(gè)數(shù)據(jù),之后就會(huì)設(shè)置尾邊界,保證后面的900個(gè)數(shù)據(jù)不再被排序。
public static void bubbleSort3(int [] a, int n){
int j , k;
int flag = n ;//flag來(lái)記錄最后交換的位置,也就是排序的尾邊界
while (flag > 0){//排序未結(jié)束標(biāo)志
k = flag; //k 來(lái)記錄遍歷的尾邊界
flag = 0;
for(j=1; j
if(a[j-1] > a[j]){//前面的數(shù)字大于后面的數(shù)字就交換
//交換a[j-1]和a[j]
int temp;
temp = a[j-1];
a[j-1] = a[j];
a[j]=temp;
//表示交換過(guò)數(shù)據(jù);
flag = j;//記錄最新的尾邊界.
}
}
}
}
這種方法是我看到的最優(yōu)化的冒泡排序了。
運(yùn)行測(cè)試?yán)咏Y(jié)果:
0,1,1,2,3,3,4,7,8,9,12,22,65,
1
可知運(yùn)行結(jié)果正確。
總結(jié)
以上是生活随笔為你收集整理的java 冒泡排序的三种写法_冒泡排序的三种实现(Java)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php send helo/ehlo f
- 下一篇: python读取usb扫码枪数据_vue