選擇排序:每次在未排序部分選擇乙個最小的放到前面,並把最小值的標記向後移動一位
特點:
1. 執行時間和輸入無關(但是並沒有用,因為即使輸入時是有序的,仍然會進行遍歷與比較,複雜度不變
2. 資料移動量是最少的,因為每次只移動乙個元素,移動n次
時間複雜度:最壞n^2,最優n^2平均n^2缺點:未排序部分若有序,仍會繼續遍歷
public static void select(intarr)
}//將剩餘部分的最小值放到i上(即排序部分的末尾)
int temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}}
插入排序:即把未排序部分的第乙個元素拿出來,插入到已排序的部分。將插入位置後面的元素後移。類似於從左往右整理撲克牌
特點:
1. 與選擇排序一樣,當前索引左邊的所有元素都是有序的,但它們的最終位置還不確定,為了給更小的元素騰出空間,它們可能會被移動。但是當索引到達陣列的右端時,陣列排序就完成了。
2. 陣列已經相對有序時,時間會減少很多(整理撲克牌時如果接近有序,也不用花太多時間)
3. 由於插入排序插入時會影響到後續元素的位置,因此用陣列來實現會有大量的時間用於元素位置移動。(可以嘗試用鍊錶改進)
最壞:n^2 最優 n 平均n^2
public
static
void
insertsort(int arr)}}
}
歸併排序:採用分治思想,將乙個陣列的排序轉化為若干小陣列的排序,然後將結果歸併起來
採用分治思想演算法複雜度始終是nlogn
public
static
void
merge(int arr)
public
static
void
mergesort(int lo,int hi,int arr)
public
static
void
merge(int lo,int mid,int hi,int arr)
int j = mid+1;
int k = lo;
int f = lo;
while(f <= hi)
}
快速排序:快速排序也是採用分治思想的排序,快速排序的思路是選取乙個隨機元素一般是a[lo](待排部分首位),
然後在分別從lo->hi,hi->lo進行掃瞄,從左邊元素找到乙個比a[lo]大的,在右側找到乙個比a[lo]小的,進行位置交換,直到左右掃瞄的標記相遇
如果i>=j ,說明 i 左側元素一定比a[lo]小了,並且j右側元素一定比a[lo]大了此時把a[lo]放到a[i]與a[j]之間即可
順序或逆序的陣列進行快排的效能十分之低,所以在進行操作之前應該先對其進行乙個打亂操作(此處未打亂)
public
static
void
quick(int arr)
public
static
void
quicksort(int lo,int hi,int arr)
public
static
intpartion(int lo,int hi,intarr)
while(arr[j]>part)
if(i>=j) break;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}arr[lo] = arr[j];
arr[j] = part;
return j;
}
幾種常見排序演算法
幾種常見排序演算法 1氣泡排序 bubble sort 氣泡排序思路 將序列當中的左右元素,依次比較,保證右邊的元素始終大於左邊的元素 第一輪結束後,序列最後乙個元素一定是當前序列的最大值 對序列當中剩下的n 1個元素再次執行步驟1。3.對於長度為n的序列,一共需要執行n 1輪比較 實現 for i...
幾種常見排序演算法
1氣泡排序 bubble sort 氣泡排序思路 1.將序列當中的左右元素,依次比較,保證右邊的元素始終大於左邊的元素 第一輪結束後,序列最後乙個元素一定是當前序列的最大值 2.對序列當中剩下的n 1個元素再次執行步驟1。3.對於長度為n的序列,一共需要執行n 1輪比較 實現 for i 0 i n...
幾種常見排序演算法
以下內容包括 氣泡排序,選擇排序,桶排序 一 氣泡排序 bubblesort public class bubblesort int temp 0 for int i 0 i1 i system.out.println arrays.tostring arr 用arrays類中的tostring方法...