八大排序算法JAVA實現(時間復雜度O(n*n)篇)


本文主要描述3個時間復雜度為n2的排序算法:冒泡排序、選擇排序、插入排序。


 

1.冒泡排序:由數組頭部開始,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。每次交換完成后,當前數組最大值就會被放在最后。

 1     public int[] bubbleSort(int[] a, int n)
 2     {
 3         for (int j = 0; j < n - 2; j++)
 4         {
 5             for (int i = 0; i < n - j - 1; i++)
 6             {// 如果當前數比下一個大,交換,否則繼續看下一個數
 7                 if (a[i] > a[i + 1])
 8                 {
 9                     int temp = a[i + 1];
10                     a[i + 1] = a[i];
11                     a[i] = temp;
12                 }
13             }
14         }
15         return a;
16     }
17     

傳入參數:a為待排序數組,n為數組長度。

第一個for循環,用j的值控制第二個循環,即比對數組的長度。由冒泡排序的定義可知,每一次都會將最大值放在最后,所以下一次排的時候就可以少管一個數;

第二個for循環,將兩個數比對,大的放在后面。

本題第一個for循環是一種小小的優化,可以不使用,直接對整個數組進行交換也是沒有問題的。


 

2.選擇排序:每次在數組中選擇最小的一個數,將其依次放在數組頭對應位置。

 1     public int[] selectionSort(int[] a, int n)
 2     {
 3         for (int j = 0; j < n - 1; j++)
 4         {//j表示需要在以j開始的數組里面尋找一個最大值填充j位
 5             int maxi = 0;
 6             for (int i = 0; i < n - j; i++)
 7             {// maxi表示當前序列最大值的下標
 8                 if (a[maxi] < a[i])
 9                 {
10                     maxi = i;
11                 }
12             }
13             if (maxi != n - j - 1)
14             {
15                 int temp = a[n - j - 1];
16                 a[n - j - 1] = a[maxi];
17                 a[maxi] = temp;
18             }
19         }
20         return a;
21     }

3.插入排序:將其模擬為往一個有序數組中插入一個值。關鍵在於需要把有序數組比當前數大的數字一個個往后移動。

 1     public int[] insertionSort(int[] a, int n)
 2     {
 3         for (int i = 1; i < n; i++)
 4         {//認為a[0]只有一個數,是有序的。所以從第二個數開始插入
 5             int nowNum = a[i];
 6             int j = i - 1;
 7             for (; j >= 0; j--)
 8             {//把所有比插入數大的數字往后挪,循環結束后就會留出一個空位
 9                 if (nowNum < a[j])
10                 {
11                     a[j + 1] = a[j];
12                 }
13                 else
14                 {
15                     break;
16                 }
17             }
18             a[++j] = nowNum;
19         }
20         return a;
21     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM