Java中常見(jiàn)的排序方式(冒泡,選擇...)

一、冒泡排序

這種排序方式是最容易理解的,主體思想就是:

指針重復(fù)地走訪過(guò)要排序的數(shù)列,一次比較兩個(gè)元素,如果他們的順序錯(cuò)誤就把他們交換過(guò)來(lái)。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說(shuō)該數(shù)列已經(jīng)排序完成。這個(gè)算法的名字由來(lái)是因?yàn)樵酱蟮脑貢?huì)經(jīng)由交換慢慢“浮”到數(shù)列的頂端,故名。


冒泡排序一次只比較兩個(gè)數(shù)字,并且這兩個(gè)數(shù)字是相鄰的。

從圖上我們可以看到,原數(shù)組為【30,8,15,18,12】。

第一次比較首先比較第0位和第一位,并且將結(jié)果大的數(shù)字往后移動(dòng),也就是交換。第0位是40, 第1 位是8,40>8,所以我們將大的數(shù)字往后移動(dòng)。

同理,如果第0位<第1 位,我們就不進(jìn)行交換。

之后我們?cè)诒容^第1位和第2位的數(shù)字。將結(jié)果大的往后移動(dòng)。

就這樣,通過(guò)n-1次比較后(n為數(shù)組長(zhǎng)度),我們就將最大的數(shù)字移到了數(shù)組的最末端。

然后再繼續(xù)進(jìn)行第二輪比較,找出第二大的數(shù)字,往后以此類推。

一共需要比較的次數(shù)為: (n-1)+(n-2)+(n-3)+·····+1;

以java代碼方式實(shí)現(xiàn):

public void bubblesort(int arrayVal[],int length) {

????? int i, j;

????? int temp;

????? for (i =0; i < length -1; i++) {

????? for (j = i +1; j < length; j++) {

??????????? if (arrayVal[i] > arrayVal[j]) {

?????????????????? //置換位置

? ? ? ? ? ? ? ??? temp = arrayVal[i];

????????????????? arrayVal[i] = arrayVal[j];

????????????????? arrayVal[j] = temp;

??????????????????? }

??????? ?? }

? ?? }

}


二、選擇排序

選擇排序(Selection sort)是一種簡(jiǎn)單直觀的排序算法。它的工作原理是每一次從待排序的數(shù)據(jù)元素中選出最?。ɑ蜃畲螅┑囊粋€(gè)元素,存放在序列的起始位置,直到全部待排序的數(shù)據(jù)元素排完。


選擇排序就是對(duì)數(shù)組中的元素進(jìn)行比較選擇,然后直接放置在排序后的位置。

首先指針K先指向數(shù)組0號(hào)位置,K相當(dāng)于指明一個(gè)目標(biāo)位置。然后另一個(gè)指針min從K開(kāi)始,往后一次比較,找到最小的值,并存儲(chǔ)在min中,比較了一輪后,min中存儲(chǔ)的數(shù)就是整個(gè)數(shù)組中最小的數(shù)字。這是直接將min中的數(shù)字和K指向的數(shù)字交換即可。然后找到數(shù)組中第二小的數(shù),讓他跟數(shù)組中第二個(gè)元素交換一下值,以此類推。

JAVA代碼實(shí)現(xiàn):

public void selectionsort(int arrayVal[],int length) {

???? int i, j, max;

???? int temp;

???? for (j = length; j >1; j--) {

????????? max =0;//標(biāo)記最值位置

? ?? for (i =1; i < j; i++) {

???????? if (arrayVal[i] > arrayVal[max]) {

??????????????????? max = i;

???????? if (max != j -1) {

??????????????? temp = arrayVal[max];

??????????????? arrayVal[max] = arrayVal[j -1];

???????????????? arrayVal[j -1] = temp;

???????????????? }

?????????? }

???? }

}

}


三、插入排序

? ? 要求在這個(gè)已經(jīng)排好的數(shù)據(jù)序列中插入一個(gè)數(shù),但要求插入后此數(shù)據(jù)序列仍然有序,這個(gè)時(shí)候就要用到一種新的排序方法——插入排序法,插入排序的基本操作就是將一個(gè)數(shù)據(jù)插入到已經(jīng)排好序的有序數(shù)據(jù)中,從而得到一個(gè)新的、個(gè)數(shù)加一的有序數(shù)據(jù),算法適用于少量數(shù)據(jù)的排序,時(shí)間復(fù)雜度為O(n^2)。


例如,已知待排序的一組記錄是:

1,3,5,8,2,1

加入之前的1,3,5,8已經(jīng)按照直接插入排序排序好了,現(xiàn)在我們需要對(duì)2進(jìn)行排序。 首先將2存在一個(gè)臨時(shí)變量temp中, 然后指針從2的前一位開(kāi)始判斷,如果前一位比2大,則將前一位往后移,以此類推,直到找到比2小的元素。這時(shí)將2插入進(jìn)去。

JAVA代碼實(shí)現(xiàn):

public static void StraightInsertSort(int[] a) {

int temp =0,j =0;

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

temp = a[i]; j = i;

while(j >0 && a[j-1] >= temp){

a[j] = a[j-1];

j--;

}

a[j] = temp;

}

}


四、 二分插入排序

將直接插入排序中尋找A[i]的插入位置的方法改為采用折半比較,即可得到折半插入排序算法。在處理A[i]時(shí),A[0]……A[i-1]已經(jīng)按關(guān)鍵碼值排好序。所謂折半比較,就是在插入A[i]時(shí),取A[i-1/2]的關(guān)鍵碼值與A[i]的關(guān)鍵碼值進(jìn)行比較,如果A[i]的關(guān)鍵碼值小于A[i-1/2]的關(guān)鍵碼值,則說(shuō)明A[i]只能插入A[0]到A[i-1/2]之間,故可以在A[0]到A[i-1/2-1]之間繼續(xù)使用折半比較;否則只能插入A[i-1/2]到A[i-1]之間,故可以在A[i-1/2+1]到A[i-1]之間繼續(xù)使用折半比較。如此擔(dān)負(fù),直到最后能夠確定插入的位置為止。一般在A[k]和A[r]之間采用折半,其中間結(jié)點(diǎn)為A[k+r/2],經(jīng)過(guò)一次比較即可排除一半記錄,把可能插入的區(qū)間減小了一半,故稱為折半。執(zhí)行折半插入排序的前提是文件記錄必須按順序存儲(chǔ)。


JAVA代碼實(shí)現(xiàn):

public int getIndex(int arr[],int x){

int start=0;

int end=arr.length-1;

int min=0;

while(start<=end){

min=(start+end)/2;

if(x==arr[min]){

return min;

}else if(x

end=min-1;

}else if(x>arr[min){

start=min+1;

}

}

return -1;

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容