這一篇主要講基礎的交換排序、選擇排序、插入排序。
如果文字描述使我們迷惑,直接看**或許是個更為明智的選擇。
來自 該博文,裡面有演算法實現的gif圖,向大家安利一下。
該博文 關於各類演算法的時間複雜度講得比較細。
假設乙個無序的array陣列含n個元素,使其變為公升序。
我們只需要遍歷n - 1次數組,每次遍歷時,比較第j個數與第j + 1個數的大小,若array[j] > array[j + 1],則交換二者的值。
因而每一次遍歷的效果就是把最大值放在了最後面。這樣,經過n - 1 次遍歷,就完成了陣列從小到大的排序。
舉個生活中例子:
給我們5張無序的卡片,上面分別寫著1,2,3,4,5這五個數字。將其從小到大排列。
1. 我們從左向右觀察這5張卡片。
2. 比較第一張卡片與第二張卡片。如果第一張比第二張卡片大,我們就調換這兩張卡片的順序,否則不動。
3. 繼續向右觀察觀察第二張卡片與第三張卡片,重複2的操作。直到第一次觀察結束,最後一張卡片一定是5。
4. 再觀察前四張卡片,重複上述行為後,第四張卡片一定是4。
5. 重複上述行為,則完成排序。
public
static
void
bubsort
(int array)
}}print
(array);}
public
static
void
swap
(int array,
int i,
int j)
public
static
void
print
(int array)
public
static
void
main
(string[
] args)
;bubsort
(array)
;}
簡單優化
上述的氣泡排序,最優的時間複雜度也是o(n
2n^2
n2),我們可以進行乙個簡單的優化,設定乙個flag,如果第一遍內部迴圈發現沒有進行交換,說明陣列本身就已經是有序的,直接break就行。這時的最優時間複雜度就是o(n)了。
因為比較簡單,在這裡不給出**實現。
我們只需要遍歷n - 1次數組,每次遍歷時,找到它們的最大值,將最大值的位置與最後面的數的位置交換。
因而每一次遍歷的效果就是把最大值放在了最後面。這樣,經過n - 1 次遍歷,就完成了陣列從小到大的排序。
舉個生活中例子:
給我們5張無序的卡片,上面分別寫著1,2,3,4,5這五個數字。將其從小到大排列。
首先,我取出第一張卡片,放在手裡。
然後,我取出第二張卡片,比較其與第一張卡片的值,將較小者放置一邊,較大者拿在手中。
重複2操作,直到所有卡都被比較了一遍,而這時握在手裡的肯定是5。
我們把手中的5當做已經排好順序的卡片,放在最右邊,再從剩下的4張卡中抽出一張卡拿在手中,重複上述操作後,新篩出來的卡一定是4。把4放在5的左邊。這時,我們已經完成了4與5的排序。
重複上述操作,即可完成5張卡片的排序。
public
static
void
selectsort
(int array)
}if(minn != i)
}print
(array);}
public
static
void
swap
(int array,
int i,
int j)
public
static
void
print
(int array)
public
static
void
main
(string[
] args)
;selectsort
(array)
;}
public
static
void
insertionsort
(int array)
array[j +1]
= u;
}print
(array)
;}
public
static
void
main
(string[
] args)
;insertionsort
(array)
;}
注意:
在插入排序時,有將當前值插入到乙個有序數列的過程,這個時候我們應該可以想到二分。但因為優化有限,這裡不展開篇幅去描述,感興趣的可以試試。
該部落格 用漫畫描述該演算法非常生動,安利一波。
前人之述備矣,我暫時想不到別的講解方法,在這裡就只貼**了(建議看完上面部落格後再看**)。
【注意:最後一次優化的計數排序,相當於為每個分數都配置乙個棧,是同一分數的同學按從左往右的順序先後壓入棧中。因此最後確定排名的時候,便得從右往左遍歷,這符合棧後進先出的特性。2019.7.19】
public
static
void
main
(string[
] args)
;int minn = a[0]
, maxx = a[0]
;for
(int i =
0; i < a.length;
++i)
int len = maxx -minn +1;
//[最大值,最小值]這個區間的長度足以記錄所有的數
int count=
newint
[len]
;//定義乙個陣列,count[i]表示值為minn+i的數在排序後的最末排名。
//比如1 2 4 4 ,count[3] 就表示值為4的數在排序後的最末排名
for(
int i =
0; i < a.length;
++i)
for(
int i =
1; i < count.length;
++i)
int ans=
newint
[a.length]
;//記錄排序後的陣列
for(
int i = a.length -
1; i >=0;
--i)
system.out.
println
(arrays.
tostring
(ans));
}
Java6學習筆記41 JAVA程式的個人設定
1.簡介 建立preferences物件的方法是使用靜態方法usernodeforpackage 這個方法要求有乙個類物件 通過getclass 方法得到 作為它唯一的引數,系統以便確定某個類是駐留在某個包上的,它返回preferences物件,這個物件可以從那個包中返回使用者設定的偏好資訊。由於所...
Java幾種常用陣列排序
package com.firewolf.sort public class mysort mysort mysort new mysort mysort.insertsort array system.out.print 插入排序結果 mysort.printarray array system....
java基礎6 陣列 排序 查詢 多維陣列
陣列 陣列可以存放 多個同一類資料 養雞場 有很多雞 體重各不一樣 怎麼算他們的平均體重 語法 陣列的定義 資料型別 陣列名 new 資料型別 大小 int a new int 5 int a 也可以 還可以 int a 1,2,3,4,5 陣列的引用 陣列名 下標 a 3 public class...