希尔排序
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 将给定数组排序
* @param arr int整型一维数组 待排序的数组
* @return int整型一维数组
*/
export function MySort(arr: number[]): number[] {
// write code here
// 希尔排序
let interval = 1
const len = arr.length
// 优化循环次数
while(interval < len / 3){
interval = 3 * interval + 1
}
// 先初次检查数组是否有序
let hasExchanges = false
for(let i = 0; i < len - 1; i++){
if(arr[i] > arr[i+1]){
[arr[i], arr[i+1]] = [arr[i+1], arr[i]]
hasExchanges = true
}
}
// 有序则退出
if(!hasExchanges) {return arr}
while(interval >= 1){
// 插入排序
for(let i = interval; i < len; i++){
let curr = arr[i]
let prevIdx = i - interval
while(prevIdx >= 0 && curr < arr[prevIdx]){
arr[prevIdx + interval] = arr[prevIdx]
prevIdx -= interval
}
arr[prevIdx + interval] = curr
}
interval = ((interval / 3) * 2) >> 1
}
return arr
}