幾種常見的排序演算法

2021-07-25 02:51:05 字數 1982 閱讀 9813

選擇排序:每次在未排序部分選擇乙個最小的放到前面,並把最小值的標記向後移動一位

特點:

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方法...