欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java利用冒泡排序?qū)?shù)組進(jìn)行排序

 更新時(shí)間:2015年05月19日 12:36:13   作者:一羽清寧  
這篇文章主要介紹了java利用冒泡排序?qū)?shù)組進(jìn)行排序的方法,實(shí)例分析了冒泡排序的概念與java實(shí)現(xiàn)方法,以及java操作數(shù)組的相關(guān)技巧,需要的朋友可以參考下

本文實(shí)例講述了java利用冒泡排序?qū)?shù)組進(jìn)行排序的方法。分享給大家供大家參考。具體如下:

一、冒泡排序:

利用冒泡排序?qū)?shù)組進(jìn)行排序

二、基本概念:

依次比較相鄰的兩個(gè)數(shù),將小數(shù)放在前面,大數(shù)放在后面。即在第一趟:首先比較第1個(gè)和第2個(gè)數(shù),將小數(shù)放前,大數(shù)放后。然后比較第2個(gè)數(shù)和第3個(gè)數(shù),將小數(shù)放前,大數(shù)放后,如此繼續(xù),直至比較最后兩個(gè)數(shù),將小數(shù)放前,大數(shù)放后。至此第一趟結(jié)束,將最大的數(shù)放到了最后。在第二趟:仍從第一對(duì)數(shù)開(kāi)始比較(因?yàn)榭赡苡捎诘?個(gè)數(shù)和第3個(gè)數(shù)的交換,使得第1個(gè)數(shù)不再小于第2個(gè)數(shù)),將小數(shù)放前,大數(shù)放后,一直比較到倒數(shù)第二個(gè)數(shù)(倒數(shù)第一的位置上已經(jīng)是最大的),第二趟結(jié)束,在倒數(shù)第二的位置上得到一個(gè)新的最大數(shù)(其實(shí)在整個(gè)數(shù)列中是第二大的數(shù))。如此下去,重復(fù)以上過(guò)程,直至最終完成排序。

三、實(shí)現(xiàn)思路:

用二重循環(huán)實(shí)現(xiàn),外循環(huán)變量設(shè)為i,內(nèi)循環(huán)變量設(shè)為j。假如有n個(gè)數(shù)需要進(jìn)行排序,則外循環(huán)重復(fù)n-1次,內(nèi)循環(huán)依次重復(fù)n-1,n-2,...,1次。每次進(jìn)行比較的兩個(gè)元素都是與內(nèi)循環(huán)j有關(guān)的,它們可以分別用a[j]和a[j+1]標(biāo)識(shí),i的值依次為1,2,...,n-1,對(duì)于每一個(gè)i,j的值依次為0,1,2,...n-i 。

設(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ù)前面二步,否則排序完成。

四、java代碼實(shí)現(xiàn):

package ArrayDemo; 
/** 
 * @author pplsunny 
 * @category .21 
 */ 
public class ArrayDemo {   
  /** 
   * 用增強(qiáng)for循環(huán)輸出排序結(jié)果 
   */ 
  public static void main(String[] args) { 
   int[] a = { 2, 4, 76, 12, 34, 23, 86 }; 
   ArrayDemo.bubbleSort(a); 
   for (int b : a) { 
    System.out.print(b + " "); 
   } 
  } 
  /* 
   * 冒泡排序函數(shù),定義為靜態(tài)的方便使用,
 * 也是開(kāi)發(fā)中定義工具類(lèi)的一個(gè)方法 
   */ 
  public static void bubbleSort(int a[]) { 
   for (int i = 1; i < a.length; i++) {
   //這是控制趟數(shù) 
    for (int j = 0; j < a.length - i; j++) {
    //j < a.length - i,比較元素的個(gè)數(shù) 
     if (a[j] > a[j + 1]) { 
      int temp = a[j]; 
      a[j] = a[j + 1]; 
      a[j + 1] = temp; 
     } 
    } 
   } 
  } 
} 

五、性能分析:

若記錄序列的初始狀態(tài)為"正序",則冒泡排序過(guò)程只需進(jìn)行一趟排序,在排序過(guò)程中只需進(jìn)行n-1次比較,且不移動(dòng)記錄;反之,若記錄序列的初始狀態(tài)為"逆序",則需進(jìn)行n(n-1)/2次比較和記錄移動(dòng)。因此冒泡排序總的時(shí)間復(fù)雜度為O(n*n)。

六、算法優(yōu)化:

冒泡排序法存在的不足及改進(jìn)方法:
第一,在排序過(guò)程中,執(zhí)行完最后的排序后,雖然數(shù)據(jù)已全部排序完備,但程序無(wú)法判斷是否完成排序,為了解決這一不足,可設(shè)置一個(gè)標(biāo)志位flag,將其初始值設(shè)置為非0,表示被排序的表是一個(gè)無(wú)序的表,每一次排序開(kāi)始前設(shè)置flag值為0,在進(jìn)行數(shù)據(jù)交換時(shí),修改flag為非0。在新一輪排序開(kāi)始時(shí),檢查此標(biāo)志,若此標(biāo)志為0,表示上一次沒(méi)有做過(guò)交換數(shù)據(jù),則結(jié)束排序;否則進(jìn)行排序;

/* 
* 冒泡排序函數(shù)改進(jìn)版 
*/ 
public static void BubbleSort(int[] a) { 
  boolean flag = true; 
  while (flag) { 
   flag = false; 
   for (int i = 0; i < a.length - 1; i++) { 
    for (int j = 0; j < a.length - i ; j++) { 
     if (a[j] > a[j + 1]) { 
      int temp = a[j]; 
      a[j] = a[j + 1]; 
      a[j + 1] = temp; 
      flag = true; 
     } 
    } 
    if (!flag) 
     break; // 如果沒(méi)有發(fā)生交換,則退出循環(huán)  
   } 
  } 
}

第二、在冒泡排序中,一趟掃描有可能無(wú)數(shù)據(jù)交換,也有可能有一次或多次數(shù)據(jù)交換,在傳統(tǒng)的冒泡排序算法及近年來(lái)的一些改進(jìn)的算法中,只記錄一趟掃描有無(wú)數(shù)據(jù)交換的信息,對(duì)數(shù)據(jù)交換發(fā)生的位置信息則不予處理。為了充分利用這一信息,可以在一趟全局掃描中,對(duì)每一反序數(shù)據(jù)對(duì)進(jìn)行局部冒泡排序處理,稱(chēng)之為局部冒泡排序。局部冒泡排序與冒泡排序算法具有相同的時(shí)間復(fù)雜度,并且在正序和逆序的情況下,所需的關(guān)鍵字的比較次數(shù)和移動(dòng)次數(shù)完全相同。由于局部冒泡排序和冒泡排序的數(shù)據(jù)移動(dòng)次數(shù)總是相同的,而局部冒泡排序所需關(guān)鍵字的比較次數(shù)常少于冒泡排序,這意味著局部冒泡排序很可能在平均比較次數(shù)上對(duì)冒泡排序有所改進(jìn),當(dāng)比較次數(shù)較少的優(yōu)點(diǎn)不足以抵消其程序復(fù)雜度所帶來(lái)的額外開(kāi)銷(xiāo),而當(dāng)數(shù)據(jù)量較大時(shí),局部冒泡排序的時(shí)間性能則明顯優(yōu)于冒泡排序。對(duì)于N個(gè)無(wú)序數(shù)據(jù),我們?cè)谶M(jìn)行一趟冒泡排序時(shí),如果第k個(gè)數(shù)據(jù)和第k+1個(gè)數(shù)據(jù)逆序,那么對(duì)第k+1個(gè)數(shù)據(jù)進(jìn)行一趟向前的冒泡排序,使其移動(dòng)到合適的位置,也就是說(shuō)讓前面k+1個(gè)數(shù)據(jù)調(diào)節(jié)為正序。因?yàn)檫@種冒泡法只對(duì)前k+1個(gè)數(shù)據(jù)冒泡處理,所以我們稱(chēng)它為——局部冒泡

希望本文所述對(duì)大家的java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 解決在微服務(wù)環(huán)境下遠(yuǎn)程調(diào)用feign和異步線(xiàn)程存在請(qǐng)求數(shù)據(jù)丟失問(wèn)題

    解決在微服務(wù)環(huán)境下遠(yuǎn)程調(diào)用feign和異步線(xiàn)程存在請(qǐng)求數(shù)據(jù)丟失問(wèn)題

    這篇文章主要介紹了解決在微服務(wù)環(huán)境下遠(yuǎn)程調(diào)用feign和異步線(xiàn)程存在請(qǐng)求數(shù)據(jù)丟失問(wèn)題,主要包括無(wú)異步線(xiàn)程得情況下feign遠(yuǎn)程調(diào)用,異步情況下丟失上下文問(wèn)題,需要的朋友可以參考下
    2022-05-05
  • Draw.io部署詳細(xì)步驟

    Draw.io部署詳細(xì)步驟

    Draw.io 是 GitHub 上的一個(gè)開(kāi)源的免費(fèi)流程圖繪制工具,功能非常的豐富,Draw.io 是開(kāi)源的,所以針對(duì)外網(wǎng)訪(fǎng)問(wèn)不穩(wěn)定或在訪(fǎng)問(wèn)不了外網(wǎng)的情況,我們可以將其部署到我們本地,也就是把本地當(dāng)作服務(wù)端,本文將一步一步介紹具體部署步驟,感興趣的朋友一起看看吧
    2023-10-10
  • SpringBoot集成netty實(shí)現(xiàn)websocket通信功能

    SpringBoot集成netty實(shí)現(xiàn)websocket通信功能

    Netty是一個(gè)高性能、異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用框架,用于快速開(kāi)發(fā)可維護(hù)的高性能協(xié)議服務(wù)器和客戶(hù)端,WebSocket 是一種網(wǎng)絡(luò)通信協(xié)議,相比傳統(tǒng)的HTTP協(xié)議,本文給大家介紹了SpringBoot集成netty實(shí)現(xiàn)websocket通信功能,需要的朋友可以參考下
    2024-03-03
  • Java開(kāi)發(fā)者推薦的10種常用工具

    Java開(kāi)發(fā)者推薦的10種常用工具

    這篇文章主要為大家詳細(xì)介紹了Java開(kāi)發(fā)者推薦的10種常用工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Idea如何集成Git&添加項(xiàng)目到git倉(cāng)庫(kù)

    Idea如何集成Git&添加項(xiàng)目到git倉(cāng)庫(kù)

    這篇文章主要介紹了Idea如何集成Git&添加項(xiàng)目到git倉(cāng)庫(kù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • java結(jié)合HADOOP集群文件上傳下載

    java結(jié)合HADOOP集群文件上傳下載

    這篇文章主要介紹了java結(jié)合HADOOP集群文件上傳下載的方法和示例,非常的實(shí)用,這里推薦給大家,希望大家能夠喜歡。
    2015-03-03
  • Spring Aop之AspectJ注解配置實(shí)現(xiàn)日志管理的方法

    Spring Aop之AspectJ注解配置實(shí)現(xiàn)日志管理的方法

    下面小編就為大家分享一篇Spring Aop之AspectJ注解配置實(shí)現(xiàn)日志管理的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Java?SpringBoot集成文件之如何使用POI導(dǎo)出Word文檔

    Java?SpringBoot集成文件之如何使用POI導(dǎo)出Word文檔

    這篇文章主要介紹了Java?SpringBoot集成文件之如何使用POI導(dǎo)出Word文檔,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-08-08
  • Java技術(shù)匯總

    Java技術(shù)匯總

    本篇文章主要對(duì)Java基本知識(shí)點(diǎn)和技術(shù)點(diǎn)的一些看法和介紹,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • 解決Java調(diào)用BAT批處理不彈出cmd窗口的方法分析

    解決Java調(diào)用BAT批處理不彈出cmd窗口的方法分析

    本篇文章是對(duì)Java調(diào)用BAT批處理不彈出cmd窗口的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評(píng)論