七種排序演算法

2022-03-24 16:23:44 字數 3892 閱讀 9022

排序方法

平均情況

最好情況

最壞情況

輔助空間

穩定性插入排序

o(n^2)

o(n)

o(n^2)

o(1)

穩定希爾排序

o(n*log(n))~o(n^2)

o(n^1.3)

o(n^2)

o(1)

不穩定選擇排序

o(n^2)

o(n^2)

o(n^2)

o(1)

不穩定氣泡排序

o(n^2)

o(n)

o(n^2)

o(1)

穩定歸併排序

o(n*log(n))

o(n*log(n))

o(n*log(n))

o(n)

穩定堆排序

o(n*log(n))

o(n*log(n))

o(n*log(n))

o(1)

不穩定快速排序

o(n*log(n))

o(n*log(n))

o(n^2)

o(1)

不穩定每步將乙個待排序的記錄,按其順序碼大小插入到前面已經排序的字序列的合適位置(從後向前找到合適位置後),直到全部插入排序完為止。

// 插入排序

public static void insertionsort(int arr)

for (int i = 1; i < arr.length; i++)

}}

先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄「基本有序」時,再對全體記錄進行依次直接插入排序。

public staticvoid shellsort(anytype a)

a[j] = tmp;}}

}

在要排序的一組數中,選出最小的乙個數與第乙個位置的數交換;然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後乙個數比較為止。

// 選擇排序

public static void selectsort(int arr)

for (int i = 0; i < arr.length - 1; i++)

swap(arr, i, minindex); }}

public static void swap(int arr, int i, int j)

氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。

// 氣泡排序

public static void bubblesort(int numbers)

int temp = 0;

int size = numbers.length;

for(int i = 0; i < size - 1; i ++)

} }}

歸併(merge)排序法是將兩個(或兩個以上)有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。

// 歸併排序

public static void mergesort(int arr)

mergesort(arr, 0, arr.length - 1);

}public static void mergesort(int arr, int l, int r)

// 使用位運算可以準確高效的計算出中間值

int mid = l + ((r - 1) >> 1);

mergesort(arr, l, mid);

mergesort(arr, mid + 1, r);

merget(arr, l, mid, r);

}public static void merget(int arr, int l, int m, int r)

// 兩個迴圈,將剩下的值倒入額外空間help中

while(p1 <= m)

while(p2 <= r)

// 將額外空間help中的數值全倒入arr[l + help.length]這段區域中

for (i = 0; i < help.length; i++)

}

堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進。

堆的定義下:具有n個元素的序列 (h1,h2,...,hn),當且僅當滿足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1) (i=1,2,...,n/2)時稱之為堆。

這裡有這樣的定義:

對於陣列中任一位置i上的元素,

其左兒子在位置2i上,

右兒子在左兒子後的單元(2i + 1)中,

它的父親則在位置[i / 2]上。

在這裡只討論滿足前者條件的堆。由堆的定義可以看出,堆頂元素(即第乙個元素)必為最大項(大頂堆)。完全二叉樹可以很直觀地表示堆的結構。堆頂為根,其它為左子樹、右子樹。

思想:初始時把要排序的數的序列看作是一棵順序儲存的二叉樹,調整它們的儲存序,使之成為乙個 堆,這時堆的根節點的數最大。然後將根節點與堆的最後乙個節點交換。然後對前面(n-1)個數重新調整使之成為堆。依此類推,直到只有兩個節點的堆,並對 它們作交換,最後得到有n個節點的有序序列。從演算法描述來看,堆排序需要兩個過程,一是建立堆,二是堆頂與堆的最後乙個元素交換位置。所以堆排序有兩個函式組成。一是建堆的滲透函式,二是反覆呼叫滲透函式實現排序的函式。

// 堆排序

public static void heapsort(int arr)

for (int i = 0; i < arr.length; i++)

int size = arr.length;

swap(arr, 0, --size);

while(size > 0)

}// 如果建立了乙個堆,

// 將index插入到堆中,

// 向上調整

public static void heapinsert(int arr, int index)

}// 調整成大根堆

public static void heapify(int arr, int index, int size)

swap(arr, largest, index);

index = largest;

left = index * 2 + 1;

} }public static void swap(int arr, int i, int j)

通過一趟排序將待排序記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分關鍵字小,則分別對這兩部分繼續進行排序,直到整個序列有序。

// 快速排序

public static void quicksort(int arr)

quicksort(arr, 0, arr.length - 1);

}public static void quicksort(int arr, int l, int r)

}// 切分

public static int partition(int arr, int l, int r)else if (arr[l] > arr[r]) else

} swap(arr, more, r);

// 返回乙個新的陣列

return new int;

} public static void swap(int arr, int i, int j)

七種排序演算法總結

根據排序過程中借助的主要操作,將7種內排序演算法按照下圖所示進行分類。將7種演算法的各種指標進行對比,如下表所示。從平均情況來看,顯然最後3種改進演算法要勝過希爾排序,並遠遠勝過前3種簡單演算法。從最好情況看,反而冒泡和直接插入排序要更勝一籌,也就是說,如果待排序列總是基本有序,反而不應該考慮四種複...

七種排序演算法整理

1.氣泡排序 交換排序 依次比較相鄰元素,將較大的值交換到右邊,那麼第一趟走完,陣列中的最大值已經在最後一位了,接下來就把第二大的數歸位,第三大的數歸位 public static void dubblesort int arr 2.選擇排序 交換排序 設定最小元素的索引minindex,假設當前索...

七種常用排序演算法總結

1.氣泡排序 bubble sort package com.zha.wmls.sort 氣泡排序 每一輪找出乙個最大的,放在最後面,穩定 時間複雜度為n 2 public class bubblesort long befortime system.currenttimemillis sort a...