Scala快排List和Array陣列效率實測

2021-08-25 19:43:19 字數 3018 閱讀 3400

package com.tingfeng.scala.test

import scala.annotation.tailrec

import scala.util.

/** * 快速排序測試

*/object

sorttest else

}initlist(size,random)

} /**

* 列印出使用的時間

* @param call

*/def printtime(call : => unit,tag: string = "")\n")

} /**

* 交換陣列中兩個位置的值,經過測試這種按位與的方式比普通建立變數交換的效率更高

* @param array

* @param x

* @param y

*/def swap(array: array[int],x:int,y:int):unit =

/*** 將傳入的值直接返回,並且執行邏輯

* @param call

* @param any

* @tparam a

*/def dothing[a<:any](any: a,call: a => unit):a =

/*** 列印列表

*/def printlist[a<%seq[any]](seq:a,size :int = 10):unit=

def shuffleintseq(seq: array[int],size: int):unit=

} def main(args: array[string]): unit =

/*** 對list快速排序

* @param list

* @return

*/def qsortlist(list: list[int]):list[int] = list match

/*** 通過每次比較陣列『head』值與其餘值的方式直接實現

* 比『head』小的值移動到其前,比『head』大的移動到其之後

* @param array

*/def qsortarray1(array: array[int]):unit =

val head = ay(start)

var spliteindex = start

for (i <- start + 1 to end)

}if(start != spliteindex)

if(start == spliteindex)

if(spliteindex != end)

}sort(array,0,array.size - 1)

} /**

* 將資料以中線拆分左右兩部分,交換值,使得右邊值比左邊大,

* 再以左或者右邊交換的界限分為兩部分做遞迴

* @param array

*/def qsortarray2(array: array[int])

}if (l < rv) sort(l, rv)

if (rv < r) sort(lv, r)

}sort(0, array.length - 1)

} /**

* 系統自帶的過濾函式,無法排序成功,因為filter返回的是引用

* @param xs

* @return

*/def qsortarray3(xs: array[int]): array[int] =else

} /**

* 系統自帶的分割函式,無法排序成功,因為partition返回的是引用,資料量大的時候會棧溢位失敗

* @param xs

* @return

*/def qsortarray4(array: array[int]): array[int] =else

}}

qsortlist

-2147483293,-2147483096,-2147481318,-2147480959,-2147479572,-2147479284,-2147478285,-2147477579,-2147476191,-2147475936,

usetime : 28808

sorting.quicksort

-2147483293,-2147483096,-2147481318,-2147480959,-2147479572,-2147479284,-2147478285,-2147477579,-2147476191,-2147475936,

usetime : 773

qsortarray1

-2147483293,-2147483096,-2147481318,-2147480959,-2147479572,-2147479284,-2147478285,-2147477579,-2147476191,-2147475936,

usetime : 1335

qsortarray2

-2147483293,-2147483096,-2147481318,-2147480959,-2147479572,-2147479284,-2147478285,-2147477579,-2147476191,-2147475936,

usetime : 629

qsortarray3

508128328,554399267,876118465,968407914,1274954088,1550124974,296879812,2125832312,1874291320,965362519,

usetime : 10617

qsortarray4

865409973,-645195021,-735017922,-1893119148,1838343395,1038029591,-560471115,-182627393,-228613831,220531987,

usetime : 6904

process finished with

exit code 0

環境:版本scala2.12.6 , win10 ,ryzen5 1600 , 8g

快排2 經典快排和荷蘭國旗快排

基礎知識見 建議先閱讀基礎知識,並自己手推一遍 演算法原理 第一步 取陣列最後乙個數作為num,將陣列中的 num的數放在陣列的左邊,num的數放在陣列的右邊,這是可以理解為分成了兩個陣列 第二步 然後將 num的部分當成乙個陣列,繼續第一步 num的部分同理 第三步 若陣列的大小 2,則結束。流程...

快排和堆排

一 快速排序 最常用的排序演算法,速度通常也是最快的。時間複雜度 o nlogn 最壞 o n 2 空間複雜度 o nlgn 不穩定 比如 5 3 3 4 3 8 9 10 11 這個序列,在中樞元素5和3交換就會把元素3的穩定性打亂 實現原理 快排主要是通過選擇乙個關鍵值作為基準值。比基準值小的都...

氣泡排序和快排

1.氣泡排序 氣泡排序要點 1 兩層迴圈,外層迴圈控制走訪數列重複進行的次數,內層迴圈進行資料的比較 交換,是資料 上浮 2 內層迴圈是相鄰的資料進行比較。var bubblesort function arr console.log arr 1,1,2,3,4,6,7,8 bubblesort 1...