java基本演算法之排序

2021-07-04 02:02:33 字數 4102 閱讀 4004

注:這個是以前寫的,主要講的是演算法的思路,此文章的歸併排序我並沒有給出,因為當時還不會,而且沒有基數排序和計數排序,最近重新學習了一遍,想要看的同學可以看我的另一篇文章:

第乙個:氣泡排序:重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。

**演示

private

int bubbertsort(int a)

第二個:直接插入排序:每次從無序表中取出第乙個元素,把它插入到有序表的合適位置,使有序表仍然有序。

第一趟比較前兩個數,然後把第二個數按大小插入到有序表中; 第二趟把第三個資料與前兩個數從前向後掃瞄,把第三個數按大小插入到有序表中;依次進行下去,進行了(n-1)趟掃瞄以後就完成了整個排序過程。

直接插入排序屬於穩定的排序,最壞時間複雜性為o(n^2),空間複雜度為o(1)。

直接插入排序是由兩層巢狀迴圈組成的。外層迴圈標識並決定待比較的數值。內層迴圈為待比較數值確定其最終位置。直接插入排序是將待比較的數值與它的前乙個數值進行比較,所以外層迴圈是從第二個數值開始的。當前一數值比待比較數值大的情況下繼續迴圈比較,直到找到比待比較數值小的並將待比較數值置入其後一位置,結束該次迴圈。

**演示

private

int directssort(int a)

a[j+1]=temp;

}return a;

}

第三個,簡單選擇排序,即依遍歷得到a[n]中的最小值,然後進行排序的過程,遍歷依次得到a[1]-a[n]最小值與[1]交換,然後遍歷a[2]-a[n]最小值和a[2]交換,以此類推。

**演示

private

int ******sort(int a)

}return a;

}

private

int shellsort(int a)

}}

方法二:

public

static

void

main(string args)

int d=a.length/2;

while (true) }}

if (d==1)

d--;

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

第五個:快速排序

設要排序的陣列是a[0]……a[n-1],首先任意選取乙個資料(通常選用陣列的第乙個數)作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序,快速排序不是一種穩定的排序演算法。

一趟快速排序的演算法是:

1)設定兩個變數i、j,排序開始的時候:i=0,j=n-1;

2)以第乙個陣列元素作為關鍵資料,賦值給key,即key=a[0];

3)從j開始向前搜尋,即由後開始向前搜尋(j–),找到第乙個小於key的值a[j],將a[j]和a[i]互換;

4)從i開始向後搜尋,即由前開始向後搜尋(i++),找到第乙個大於key的a[i],將a[i]和a[j]互換;

5)重複第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中a[j]不小於key,4中a[i]不大於key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進行交換的時候i, j指標位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令迴圈結束)。

演算法演示:

這個是網上的寫法,目前還不太會,記錄一下,以後再繼續研究!!!!

if(low >= high)

int first = low;

int last = high;

int key = a[first];/*用字表的第乙個記錄作為樞軸*/

while(first

< last)

a[first] = a[last];/*將比第乙個小的移到低端*/

while(first

< last && a[first] <= key)

a[last] = a[first]; /*將比第乙個大的移到高階*/

}a[first] = key;/*樞軸記錄到位*/

quicksort(a, low, first-1);

quicksort(a, first+1, high);

}第六個:堆排序:(判斷是否是堆可以判斷是否是完全二叉樹)

n個關鍵字序列kl,k2,…,kn稱為(heap),當且僅當該序列滿足如下性質(簡稱為堆性質):

(1)ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n/2),當然,這是小根堆,大根堆則換成》=號。//k(i)相當於二叉樹的非葉子結點,k(2i)則是左子節點,k(2i+1)是右子節點

若將此序列所儲存的向量r[1..n]看做是一棵完全二叉樹的儲存結構,則堆實質上是滿足如下性質的完全二叉樹:

樹中任一非葉子結點的關鍵字均不大於(或不小於)其左右孩子(若存在)結點的關鍵字。

【例】關鍵字序列(10,15,56,25,30,70)和(70,56,30,25,15,10)分別滿足堆性質(1)和(2),故它們均是堆,其對應的完全二叉樹分別如小根堆示例和大根堆示例所示。

大根堆和小根堆:根結點(亦稱為堆頂)的關鍵字是堆裡所有結點關鍵字中最小者的堆稱為小根堆,又稱最小堆。根結點(亦稱為堆頂)的關鍵字是堆裡所有結點關鍵字中最大者,稱為大根堆,又稱最大堆。注意:①堆中任一子樹亦是堆。②以上討論的堆實際上是二叉堆(binary heap),類似地可定義k叉堆。

待補充
第七個:歸併排序(二路歸併排序)

歸併排序是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。

歸併過程為:比較a[i]和a[j]的大小,若a[i]≤a[j],則將第乙個有序表中的元素a[i]複製到r[k]中,並令i和k分別加上1;否則將第二個有序表中的元素a[j]複製到r[k]中,並令j和k分別加上1,如此迴圈下去,直到其中乙個有序表取完,然後再將另乙個有序表中剩餘的元素複製到r中從下標k到下標t的單元。歸併排序的演算法我們通常用遞迴實現,先把待排序區間[s,t]以中點二分,接著把左邊子區間排序,再把右邊子區間排序,最後把左區間和右區間用一次歸併操作合併成有序的區間[s,t]。

public

class

mergesort

return nums;

}public

static

void

merge(int nums, int low, int mid, int high) else

}// 把左邊剩餘的數移入陣列

while (i <= mid)

// 把右邊邊剩餘的數移入陣列

while (j <= high)

// 把新陣列中的數覆蓋nums陣列

for (int k2 = 0; k2 < temp.length; k2++)

}// 歸併排序的實現

public

static

void

main(string args) ;

mergesort.sort(nums, 0, nums.length-1);

system.out.println(arrays.tostring(nums));

}}

各個排序方法比較:

排序方法 平均時間 最壞時間 輔助儲存

簡單排序 o(n2) o(n2) o(1)

快速排序 o(nlogn) o(n2) o(logn)

堆排序 o(nlogn) o(nlogn) o(1)

歸併排序 o(nlogn) o(nlogn) o(n)

基數排序 o(d(n+rd)) o(d(n+rd)) o(rd)

ps:直接插入排序、氣泡排序為簡單排序

希爾排序、堆排序、快速排序為不穩定排序

Java實現基本排序演算法

public class sort public static sort getinstance return sort private void move int array,int from,int end 交換陣列中的兩個元素的位置 param array 待交換的陣列 param i 第乙個...

基本排序演算法Java實現

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

基本排序演算法java實現

七種基於比較排序演算法記憶口訣 冒擇入希速歸堆 冒失選擇入口的希望是快速回歸馬王堆 氣泡排序 public class bubblesort 從右邊開始,每次迴圈最小值向左沉下去 選擇排序 public class selectionsort tmp arr i arr i arr k arr k ...