java冒泡排序和快速排序的分析

來源:互聯網
上載者:User

標籤:java   快速排序   冒泡排序   演算法   

      說來慚愧,昨天面試的時候遇到快速排序的筆試題沒答上來。搞java的長期接觸的是業務方面的東西,特別是web方向的java,久而久之在學校裡面學的最基本的一些東西給忘記了。網上搜尋了這兩種演算法,基本都是當年書本的解釋,個人不是很喜歡。現將自身強化後的解釋描述出來,加強記憶,最近有面試的同志不妨看看。

 

1.冒泡排序

書本上的基本理念是左邊元素跟右側元素一個個對比,有更小的就交換。

我將此分解為:

a.將數組的最小元素放在左邊;

b.對右邊做遞迴;

這個比較簡單,實現a的代碼:

// a.將數組的最小元素放在左邊public static void bubbleBasic(int[] list) {// 基本前提if(list != null && list.length > 1) {// 從第二個元素開始對比for(int i=1;i<list.length;i++) {// 發現更小的就替換if(list[0] > list[i]) {int tmp = list[0];list[0] = list[i];list[i] = tmp;}}}}

a+b的代碼:

// a+b.完整的冒泡排序public static void bubbleSort(int[]list, int begin) {if(list != null && (list.length - begin) > 1) {for(int i=begin+1;i<list.length;i++) {if(list[begin] > list[i]) {int tmp = list[begin];list[begin] = list[i];list[i] = tmp;}}bubbleSort(list, begin +1);}}

當然有更簡單的不用遞迴的方式的書本代碼:

// 書本的冒泡排序public static void bubbleBook(int[] list) {if(list != null && list.length > 1) {for(int i = 0 ; i < list.length-1 ; i++){for(int j = i+1 ; j < list.length ; j++){if(list[i] > list[j]) {int tmp = list[i];list[i] = list[j];list[j] = tmp;}}}}}


2.快速排序

書本上的基本理念是高位低位交叉對比,把數組分成兩部分,左邊都小於某個元素A,右邊都大於A。

個人感覺這個描述很暈,其實是包含兩部分,1.交叉對比,2.左邊都小右邊都大。我屏蔽掉第1點,把A固定成第一個元素,將此問題分解為:

a.把數組第一個元素放在某個位置,使得左邊都小於它,右邊都大於它;

b.對左右做遞迴;

對於a,不限制實現方式,相信絕大部分人都能做到。其實嘛演算法就是要理解思想,實現方式是很多的,當然我這裡也是用交叉對比來實現,我比較喜歡叫左右壓縮對比。

實現a的代碼:

// a.把數組第一個元素放在某個位置,使得左邊都小於它,右邊都大於它public static void quickBasic(int[] list) {// 基本前提if(list != null && list.length > 1) {// 第一個元素當前位置int i_current = 0;// 得到左右邊界int i_left = 0;int i_right = list.length -1;// 只要右邊界還大於左邊界,說明還有壓縮空間while(i_left < i_right) {// 不斷壓縮右邊界,直到沒有壓縮空間或者出現比第一個元素更小的元素while(i_current < i_right && list[i_current] < list[i_right]) {i_right--;}// 交換元素(即使沒找到更小元素也交換,因為一直找不到的話i_right最終會等於i_current,這時候就是自身跟自身交換,就當冗餘步驟好了)int tmp = list[i_current];list[i_current] = list[i_right];list[i_right] = tmp;// 第一個元素的位置已經改變i_current = i_right;//----------元素交換到右邊後開始對左邊壓縮,跟上面的過程完全相反----------while(i_current > i_left && list[i_current] > list[i_left]) {i_left++;}tmp = list[i_current];list[i_current] = list[i_left];list[i_left] = tmp;i_current = i_left;//-----------返回while重複上面過程----------}//-----------程式運行到這裡,已經沒有壓縮空間了,功能完成,這時候i_left = i_current = i_right}}

a+b的代碼:

// a+b.完整的快速排序public static void quickSort(int[] arr, int leftIndex, int rightIndex){if(arr != null && leftIndex < rightIndex) {// 備份一下初始化的左右邊界,遞迴時候用到int _leftIndex = leftIndex;int _rightIndex = rightIndex;int currentIndex = leftIndex;while(leftIndex < rightIndex) {while(currentIndex < rightIndex && arr[currentIndex] < arr[rightIndex]) {rightIndex--;}int tmp = arr[currentIndex];arr[currentIndex] = arr[rightIndex];arr[rightIndex] = tmp;currentIndex = rightIndex;while(leftIndex < currentIndex && arr[leftIndex] < arr[currentIndex]) {leftIndex++;}tmp = arr[currentIndex];arr[currentIndex] = arr[leftIndex];arr[leftIndex] = tmp;currentIndex = leftIndex;}// 左右開始遞迴quickSort(arr, _leftIndex, currentIndex-1);quickSort(arr, currentIndex+1, _rightIndex);}}

快速排序暫時沒發現不用遞迴能實現的方法。


上述方法的測試執行個體:

public static void main(String[] args) {int[] list = new int[]{2,1,4,5,8,7,6,3,9,0};bubbleBasic(list);// 結果是0,2,4,5,8,7,6,3,9,1(列印方法就不寫了)list = new int[]{2,1,4,5,8,7,6,3,9,0};bubbleSort(list, 0);// 結果是0,1,2,3,4,5,6,7,8,9list = new int[]{2,1,4,5,8,7,6,3,9,0};bubbleBook(list);// 結果是0,1,2,3,4,5,6,7,8,9list = new int[]{2,1,4,5,8,7,6,3,9,0};quickBasic(list);// 結果是0,1,2,5,8,7,6,3,9,4list = new int[]{2,1,4,5,8,7,6,3,9,0};quickSort(list, 0, list.length -1);// 結果是0,1,2,3,4,5,6,7,8,9}


java冒泡排序和快速排序的分析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.