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
}}
環境:版本scala2.12.6 , win10 ,ryzen5 1600 , 8gqsortlist
-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
快排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...