冒泡排序
原理:冒泡排序,就是如同一個一個氣泡一樣有規律的冒出。在數組的排序實現,就是其中的最值一個個冒出到最後。
//冒泡排序
public static void bulle(int[] array) {
//冒出最值的次數(array.length-1 最後一個不需要冒泡 自然有序)
for(int i=0;i<array.length-1;i++) {
//冒泡排序核心:一個一個比較,冒出一個最值
//array.length-1-i array.length-1保證數組不會出現越界異常,
//每次冒泡後,排序好的不用冒泡比較所以每執行i次就有i次不需要排序
for(int j=0;j<array.length-1-i;j++) {
//冒出最大值
if(array[j]>array[j+1]) {
//交換
int temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
}
注意:在交換時 int temp變量應該寫在循環外,不然每次交換多會生成一個temp變量浪費了空間。這裏寫在裏邊時爲了更好的理解程序。
插入排序
原理:先取出一個數,接着再取出一個數和之前的的數,放在前或後面排序好,接着就是一個個去數插入已經排序好的數組中。
//插入排序
public static void insertSort(int[] arr) {
for(int i=0;i<arr.length;i++) {//從頭一個個取出數arr[i]
for(int j=0;j<i;j++) {//和排序好的比較 數組下標從0到(i-1)已經排序好
if(arr[i]<arr[j]) {
int temp=arr[j];
arr[j]=arr[i];
arr[i]=temp;
}
}
}
}
選擇排序
原理:找到數組最值的下標,通過下標實現把數放在指定位置(這裏是把最值放在開頭)。接着在剩餘元素裏邊繼續找最值,放到數組指定位置。
//選擇排序
public static void selectSort(int[] arr) {
//查找最值次數
for(int j=0;j<arr.length;j++) {
int key=j;//默認最值下標爲剩餘數組第一個
for(int i=j;i<arr.length;i++) {
//找到最值
if(arr[i]<arr[key]) {
key=i;//剩餘元素最值下標
}
}
//把最值放在數組前j的位置
int temp=arr[j];
arr[j]=arr[key];
arr[key]=temp;
}
}
快速排序
原理:第一次從數組中挑出一個數(一般用第一個數),通個比較把小於和大於它的數有規律放在它的兩側,一側爲大於它的一側爲小於它的,不需要在意左右兩側的順序只需用挑出的數進行分開就行。接着對左、右兩測分別進行之前的操作,取出一個數,然後小於和大於它的數分類。如此重複直到不能分爲止數組就實現了排序。
這是轉載的快速排序視頻鏈接:快速排序視頻
//快速排序
public static void quickSort(int[] arr, int left,int right){
if(left>=right) {
return;
}
int temp=arr[left];
int i=left;
int j=right;
while(i!=j) {
//找到左右兩數
while(arr[j]>=temp&&i<j) {
j--;
}
while(arr[i]<=temp&&i<j) {
i++;
}
//交換
int t=arr[j];
arr[j]=arr[i];
arr[i]=t;
}
//跳出循環 中間數和基數交換
arr[left]=arr[i];
arr[i]=temp;
//遞歸排完所有
quickSort(arr,left,i-1);
quickSort(arr,i+1,right);
}
轉載一下在別的地方看到的寫的很好很詳細的排序文章:十大經典排序算法