JS演算法3 排序 歸併排序 快速排序

2021-09-11 05:09:10 字數 3041 閱讀 4247

歸併排序

1.左右兩邊先排序;

2.再借助輔助陣列,指標在左右兩個陣列中移動,兩指標作比較,小的就往輔助陣列中填;

3.整體在輔助陣列中有序後,拷貝回原陣列。

//歸併排序 時間複雜度o(n*logn)

var list =[5

,2,6

,1,22

,77,4

,12];

console.

log(

'未排序'

,list)

;function

merge

(arr,l,mid,r)

while

(p1 <= mid)

while

(p2 <= r)

for(i=

0; i

function

sortprocess

(arr,l,r)

var mid =

parseint

((l+r)/2

);sortprocess

(arr,l,mid)

;sortprocess

(arr,mid+

1,r)

;merge

(arr,l,mid,r);}

function

mergesort

(arr)

sortprocess

(arr,

0,arr.length-1)

;}mergesort

(list)

;console.

log(

'歸併排序'

,list)

;

除錯結果如下:

報錯總結:在沒有把mid取整時,出現了無限迴圈的情況

遞迴演算法:

系統中乙個函式調子過程之前,會將函式、引數…都壓入棧中,子過程返回之後,重新呼叫棧中函式,徹底還原。

( 自己呼叫自己 )

//遞迴找最大值

var nums =[4

,3,2

,1];

var len = nums.length;

function

getmax

(arr,l,r)

var mid =

parseint

((l+r)/2

);var maxleft =

getmax

(arr,l,mid)

;var maxright =

getmax

(arr,mid+

1,r)

;return math.

max(maxleft,maxright);}

console.

log(

getmax

(nums,

0,len-1)

);

除錯結果如下:

快速排序

1.每一趟排序都將資料分割兩部分,左邊小,右邊大;

2.按此方法對接著將左和右也遞迴切分;

3.以此達到整個資料變成有序序列

//快速排序 複雜度最壞為o(n^2)

var arr =[4

,9,11

,1,3

,5,88

,22,7

,2,5

];function

quicksort

(arr,l,r)

}function

partition

(arr,l,r)

else

if(arr[l]

> arr[r]

)else

}swap

(arr,more,r)

;return

newarray

(less+

1,more);}

function

swap

(arr,i,j)

quicksort

(arr,

0,arr.length-1)

;console.

log(

'快排'

,arr)

;

荷蘭國旗問題
var arr1 =[4

,9,11

,1,3

,5,88

,22,7

,2];

var arr2 =[3

,1,2

,4];

var arr3 =[9

,11,55

,7];

function

partition

(arr,l,r,num)

else

if(arr[cur]

> num)

else

}return arr;

}function

swap

(arr,i,j)

console.

log(

'arr1'

,partition

(arr1,

0,arr1.length-1,

5));

console.

log(

'都小於num的arr2'

,partition

(arr2,

0,arr2.length-1,

5));

console.

log(

'都大於num的arr3'

,partition

(arr3,

0,arr3.length-1,

5));

3 排序演算法 歸併排序

問題描述 歸併排序演算法對下列例項排序,寫出基於歸併排序演算法對下面例項進行排序的具體過程。a 48,12,61,3,5,19,32,7 解題思想 將n個元素分成2個子集合,分別對子集合進行排序,最終將排好序的子集合合併為有序集合。n 1是中止。如下 include include using na...

演算法 1 排序 歸併排序

歸併排序思想 1.把長度為n的輸入序列分成兩個長度為n 2的子串行 2.對這兩個子串行分別採用歸併排序 3.將兩個排序好的子串行合併成乙個最終的排序序列。小結 平均時間複雜度o nlogn 最好情況o nlogn 最壞情況o nlogn 空間複雜度o n 占用額外記憶體 穩定性 穩定 歸併排序入口 ...

19 排序 歸併排序

將已有序的子串行合併,得到有完全有序的序列 leftstart 左邊陣列的起始位置,rightstart 右邊陣列的起始位置,rightend 右邊陣列的結束位置 void merge elementtype a,elementtype tmpa,int leftstart,int rightsta...