資料結構 Java實現 排序

2021-07-09 02:23:24 字數 2847 閱讀 4357

直接插入排序

希爾排序(二分插入)

簡單選擇排序

堆排序歸併排序

快速排序

氣泡排序

桶式排序(基數排序)

插入排序由n-1趟排序組成,對於p=1到p=n-1趟,保證位置0到p上的元素為已排序狀態。在第p趟,將位置p上的元素向左移動到正確位置。

s(n)=o(n^2)

public

static

super anytype>>

void

insertionsort(anytype a)

}

希爾排序通過比較相距一定間隔的元素來工作,各趟比較所用的距離隨著演算法的進行而減小,直到比較相鄰元素的最後一趟排序為止。設增量序列為h[n], h[t]=n/2, h[k]=h[k+1]/2。即從陣列長度的一半開始為原始增量,不斷二分直至為1.

public

static

super anytype>>

void

shellsort(anytype a)

}

簡單選擇排序類似氣泡排序,但是不需要依次相鄰交換,而是新建乙個臨時變數儲存最小值下標,不斷縮小範圍尋找最小值,然後依次排列。

private static>

void choicesort(anytype a)

}if(i!=min)

}}

堆排序就是利用了二叉堆這個特殊資料結構的特性–排列規律,每次能夠刪除根節點(最大或最小值)。每次刪除根節點後,再將根節點放在尾部以實現排序。簡而言之就是對未排序部分做下濾操作後將根節點放於尾部。

/**這裡要利用到堆結構排列在陣列中後的特殊特性。不理解可以先畫個堆自己插入、刪除走一遍,觀察在陣列中的訪問步驟。

*對於陣列中任一位置i上的元素,其左兒子在位置2i上,它的父親在位置[i/2]上。(0位置為空的情況下)

*///堆排序

private

static

intleftchild(int i)

private

static

super anytype>>

void

percdown(anytype a, int i, int n) //三個引數,陣列物件,節點,陣列長度範圍

a[i]=tmp; //相當於a[child]=tmp;就是將a[i]值跟它的字節點互換

}public

static

super anytype>>

void

heapsort(anytype a)

}

歸併排序就是將兩個有序陣列合併,雙指標同時遍歷兩個陣列,比較大小並依次排放在第三個新建的陣列中。通過遞迴地將陣列不斷二分再分別合併,最終會二分至只有1個元素的陣列從而完成排序。

//將兩個有序陣列進行組合的merge方法

public

static

super anytype>>

void

merge(anytype a,anytype tmparray,int leftpos,int rightpos, int rightend)

}//歸併操作的單引數過載方法

public

static

super anytype>>

void

mergesort(anytype a)

快速排序即選取樞紐元,將比它小的放在左邊,大的放在右邊,然後遞迴地對左右兩邊進行快排。關鍵點在於選取樞紐元的方法,這裡採用三數分割法,選取的同時將三個數排序,將樞紐元放在n-1處,可以縮小排序範圍。

//快速排序

public stativsuper anytype>>

void

quicksort(anytype a)

//三數分割法

private

static

super anytype>>

void

median3(anytype a,int left, int right)

//快排主函式

private

static

super anytype>>

void

quicksort(anytype a,int left, int right)

//i指標右移尋找較大的數(>=)

while(a[--j].compareto(pivolt)>0){} //j指標左移尋找較小的數(<=)

if(i//i、j指標沒有相遇則交換i、j指向的值,即大的放右邊小的放左邊

swapreferences(a,i,j);

else

//相遇則跳出

break;

}//最後一步,將i指向的數與放在尾部的中值互換,完成小的在中值左邊,大的在中值右邊

swapreferences(a,i,right-1);

//遞迴地分別對左右兩邊快排

quicksort(a,left,i-1);

quicksort(a,i+1,right);

}else

insertionsort(a,left,right);

}

氣泡排序和選擇排序類似,但是沒有建立臨時變數,而是通過相鄰交換將最大或最小值不斷後移達到依次排序的效果。

private

static

super anytype>>

void

bubblesort(anytype a)

}}

佔坑

資料結構 內排序 Java實現

都說資料結構是我們程式設計師的基本功之一,那麼內排序就是資料結構裡必不可少的重要部分。所以自己在學習這部分內容的同時也希望能給大家帶來更多的東西,希望你能有所收穫!在排序過程中,整張表都是在記憶體中處理,不涉及內 外存的資料交換,稱之為內排序。反之,排序過程中需涉及內外存交換的,稱之為外排序。排序過...

java資料結構排序之希爾排序實現

早上鮮血來潮想寫個希爾排序演算法,發現發生了錯誤,一直不解,最初寫的 如下所示 static void shellsort int datalist,int dk else datalist flag temp print datalist 想呼叫它試試,卻發現 錯誤原因在於紅色 注釋處的判斷條件,...

java資料結構 排序

資料的移動方式,可分為 直接移動 和 邏輯移動 兩種。直接移動改變兩個資料的位置,而邏輯移動,則是改變資料的指標。資料移動使用的記憶體 內部排序,排序的資料量小,可以完全在記憶體中進行。外部排序,排序的資料量無法直接在記憶體內進行排序,而必須使用輔助儲存器。排序演算法的選擇,通常由以下幾點決定 演算...