面試題之 常用排序演算法

2021-06-18 11:08:29 字數 2865 閱讀 5076

以下排序預設排序效果是從小到大,待排序序列:3,4,63,4,-9,0,1,32,-2

基本思想:依次交換相鄰兩個元素,使得大的資料往下沉(或小的資料往上附浮)

第一步:比較相鄰的兩個元素,如果前者比後者大,則交換兩元素。否則,不交換。

第二步:重複第一步直到最後兩個元素比較完成,此時,最大的元素已經在最後面了,此趟排序完成。

第三步:去除最後元素,重複上述兩步,對最後元素之前的資料進行排序。

第四步:每趟排序完成後,大的資料會忘下沉,也就是需要排序的資料會越來越少,直到沒有任何一對資料需要排序,排序成功

排序過程示例:

**示例:

public void bullle(int array) 

}} }

基本思想:雞尾酒排序法相當於雙向氣泡排序,在雞尾酒排序中,在從左向右的方向上,使大的資料往下沉,在回來也就是從右往左的方向上,使小的資料往上浮。

過程示例:

**示例:

public void cocktailsort(int array) 

}//使小的資料往上浮

for(int j=array.length-2-k; j>k; j--)

//將j所在位置元素賦值給i所指向的元素,並使i向後移動

if(i=j時,迴圈查詢結束,將基準值賦值給i所在位置

array[i] = temp;

//對基準值分割的兩部分進行排序

if(i-1>start)

if(i+1基本思想:排序序列分為兩部分,前一部分是已排序的序列,後一部分為待排序序列。

第一步:從待排序序列中選擇乙個元素,依次比較其和已排序序列中的元素的大小,直到找到乙個比它大的元素,並將其插入到這個元素前邊

第二步:重複上步,直到待排序序列中沒有元素了。

排序過程示例:

**示例:

public void insertsort(int array)

// array[j] = temp;

// break;

// }

// }

/** 第二種方法,從後往前搜尋,直到找到乙個比它小的元素

* 同樣將這個元素往後所有已排序序列中的元素向後移動

* */

int temp = array[i];

int j = i;

if(array[j-1]>temp)

}//將這個元素賦值給相應位置

array[j] = temp;

} }

這個選擇排序和插入排序看上去很像,都是從未排序的序列中選擇乙個元素,然後插入到已排序序列中。不過它們有很大的不同,選擇排序是從待排序序列中選擇

乙個最小的元素,然後將這個元素插入到已排序序列的最後,這個方法的優點是,不需要頻繁的在陣列中移動資料,只需要兩兩交換即可。

基本思想: 第一步:從待排序序列中通過比較,找到最小的元素,記錄其位置和值

排序過程示例:

**示例:

public void selectsort(int array) 

}if(loc != i)

} }

6.歸併排序

基本思想:將待排序序列分為的兩部分,然後對這兩部分分別排序,最後將兩部分按某種方法合併。排序的過程是乙個遞迴的過程。歸併法是演算法中分治法的乙個典型代表。因此,歸併排序也分為兩部分,分的過程和治(合併)的過程。

合併使用的方法是:比較兩個佇列的隊首元素,將小的從該佇列中移除並插入到新佇列的第乙個位置,然後在比較兩佇列的首元素大小,將小的從該佇列移除並將其新增到新佇列上次新增的元素的後面,重複第二步知道有乙個隊列為空。將不為空的佇列剩下所有的元素依次新增到新佇列的最後。

排序過程示例:

第一次分割:{3,  4,  63,  2}{-9,  0,  1,  32,  -2}

下面以分割後的第一部分為例。

第二次分割:{{3,4}{63, 2}} 第三次分割:{{{3}{4}}{{63}{2}}}

合併的過程:第一次合併:{{3,4}{2,63}} 第二次合併:{2,3,4,63}至此,第一部分已經排序完畢,第二部分排序方法相同,為{-9,-2,0,1,32}

最後將兩部分合併為:{-9,-2,0,1,2,3,4,32,63}

**示例:

private void mergesort(int array, int start, int end) 

int middle = (end - start + 1)/2 + start;

//分的過程

mergesort(array, start, middle-1);

mergesort(array, middle, end);

//合併的過程

merge(array, start, middle, end); }

private void merge(int array, int start, int middle, int end) else

loc++;

} while(i

面試題之(氣泡排序)

什麼是氣泡排序呢?其原理就是依次比較相鄰的兩個值,如果後面的比前面的小,則將小的排到前面。依照這個規則進行多次並且遞減的迭代,直到順序正確。請看下面引用網上的動態圖可以更直觀的了解氣泡排序的乙個工作原理 請看下面的 是如何實現的氣泡排序 var examplearr 2,3,1,5,4 functi...

演算法面試題之對n個數排序

a檔案中最多有n個正整數,而且每個數均小於n,n 10的七次方。不會出現重複的數。要求對a檔案中的數進行排序,可用記憶體為1m,磁碟可用空間足夠。演算法面試題之統計詞頻前k大 中的基於檔案的歸併排序演算法顯然是可以秒殺的,但是不是很好寫,這道題目強調了每個數字都小於10 7,而且不會出現重複的數字,...

常用面試題

一 mybatis防止sql注入 1 預編譯語句,盡量使用 而不是使用 2 使用儲存過程,用的不多,推薦使用第一種。二 arraylist和linkedlist的區別 1.arraylist是實現了基於動態陣列的資料結構,linkedlist基於鍊錶的資料結構。2.對於隨機訪問get和set,arr...