java八大排序演算法

2021-08-17 09:51:26 字數 4211 閱讀 2682

學習左程雲演算法課初級班

1,歸併排序,這是分治的思想,例如有乙個陣列,先將左半部分排好序,再將右半部分排好序,最後再將兩邊的數通過乙個輔助陣列將它們逐個放到輔助陣列裡面,這個過程中逐漸比較兩邊頭位置的數的大小。

求乙個陣列的中間位置,可以int mid = l + ((r - l) >> 1);右移運算(位運算)速度快一些。

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 - l) >> 1);

mergesort(arr, l, mid);

mergesort(arr, mid + 1, r);

merge(arr, l, mid, r);

}public

static

void

merge(int arr, int l, int m, int r)

while (p2 <= r)

while (p1 <= m)

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

}

2,快速排序,快排的partition過程。經典排快時間複雜度是nlogn。在工程上一般不會用遞迴函式,遞迴易報錯,工程上遞迴函式一般要改為非遞迴版本。
public

static

int partition(int arr, int l, int r, int p) else

if (arr[l] > p) else

}return

newint ;

}

這個方法返回的是等於區域的首尾下標。

經典快排**:

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

newint ;

}

3,選擇排序
public

static

void

selectionsort(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

selectionsort(int arr)

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

}swap(arr, i, minindex);

}}

選擇排序**較簡單。

4,氣泡排序

public

static

void

bubblesort(int arr)

for (int e = arr.length - 1; e > 0; e--) }}

}public

static

void

swap(int arr, int i, int j)

5,堆排序

完全二叉樹(堆就是完全二叉樹),堆分文大根堆和小根堆。大根堆:每個節點的值都不大於其父節點的值,小根堆則反之。

可以把乙個陣列理解為二叉樹,借用二叉樹的結構。把乙個陣列想象成完全二叉樹。

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)

}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;

}}

先建大根堆,建堆的過程就是heapinsert的過程,時間複雜度低,是logn,其實就是二叉樹的層數,建堆後不一定有序。然後讓最後乙個數和堆頂位置的數交換,換完之後陣列的最後乙個數就是最大的數,然後堆的大小減1,最後這個數就不動了,然後堆再進行乙個heapify的過程,又會重新調整成乙個大根堆,然後又把最後乙個數和堆頂的數交換,以此類推,直到整個陣列有序(每次都是最後乙個數和堆頂的數交換)。
swap(arr, largest, index);
優先順序佇列就是堆。

6,插入排序

public

static

void

insertionsort(int arr)

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

public

static

void

swap(int arr, int i, int j)

7,桶排序
public static void bucketsort(int arr) 

intmax = integer.min_value;

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

int bucket = new int[max + 1];

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

int i = 0;

for (int j = 0; j < bucket.length; j++)

}}

8,基數排序
public

static

void

radixsort(int arr)

radixsort(arr, 0, arr.length - 1, maxbits(arr));

}public

static

intmaxbits(int arr)

int res = 0;

while (max != 0)

return res;

}public

static

void

radixsort(int arr, int begin, int end, int digit)

for (i = begin; i <= end; i++)

for (i = 1; i < radix; i++)

for (i = end; i >= begin; i--)

for (i = begin, j = 0; i <= end; i++, j++) }}

public

static

intgetdigit(int x, int d)

八大排序演算法java

本文只介紹演算法實現的 預設都這一已經理解演算法思想,若不理解可以參考八大排序演算法思想 交換兩個數 public static void swap int arr,int i,int j 氣泡排序 public static void bubblesort int arr for int i 0 ...

八大排序演算法Java實現

常見的八大排序演算法,它們之間的關係如下 經常碰到這樣一類排序問題 把新的資料插入到已經排好的資料列中。將第乙個數和第二個數排序,然後構成乙個有序序列 將第三個數插入進去,構成乙個新的有序序列。對第四個數 第五個數 直到最後乙個數,重複第二步。首先設定插入次數,即迴圈次數,for int i 1 i...

八大排序演算法

1.直接插入排序 原理 將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。實現 void insertsort node l,int length void shell ...