插入排序
fun insertSort(arr: IntArray) {
for (i in 1 <em>until </em>arr.size) {
val temp = arr[i]
var preIndex = i - 1
while (preIndex >= 0 && arr[preIndex] > temp) {
arr[preIndex + 1] = arr[preIndex]
preIndex--
}
arr[preIndex + 1] = temp
}
}
希尔排序
fun shellSort(array: IntArray) {
val len = array.size
var temp: Int
var gap = len / 2
while (gap > 0) {
for (i in gap until len) {
temp = array[i]
var preIndex = i - gap
while (preIndex >= 0 && array[preIndex] > temp) {
array[preIndex + gap] = array[preIndex]
preIndex -= gap
}
array[preIndex + gap] = temp
}
println(array.contentToString())
gap /= 2
}
}
快速排序
fun quickSort(arr: IntArray, left: Int, right: Int) {
if (left < right) {
var i = left
var j = right
val datum = arr[left]
while (i < j) {
//从右往左找不大于基准位的数据
while (i < j && arr[j] > datum) {
j--
}
//将不大于基准位的数据填入到左边空位
if (i < j) {
arr[i++] = arr[j]
}
//从左往右找不小于基准位的数据
while (i < j && arr[i] < datum) {
i++
}
//将不小于基准位的数据填入到右边空位
if (i < j) {
arr[j--] = arr[i]
}
}
//将基准数据放入到最后的空位
arr[i] = datum
//递归调用, 对基准值两侧的数组排序
quickSort(arr, left, i - 1)
quickSort(arr, i + 1, right)
}
}
堆排序
private var len: Int = 0
fun heapSort(arr: IntArray) {
len = arr.size
buildMaxHeap(arr)
while (len > 0) {
println(arr.contentToString())
swap(arr, 0, len - 1)
len--
adjustHeap(arr, 0)
println(arr.contentToString())
}
}
private fun buildMaxHeap(arr: IntArray) {
for (i in (len / 2 - 1) downTo 0) {
adjustHeap(arr, i)
}
}
private fun adjustHeap(arr: IntArray, i: Int) {
var maxIndex = i
if (i * 2 < len && arr[i * 2] > arr[maxIndex]) {
maxIndex = i * 2
}
if (i * 2 + 1 < len && arr[i * 2 + 1] > arr[maxIndex]) {
maxIndex = i * 2 + 1
}
if (maxIndex != i) {
swap(arr, maxIndex, i)
adjustHeap(arr, maxIndex)
}
}
private fun swap(arr: IntArray, i1: Int, i2: Int) {
val temp = arr[i1]
arr[i1] = arr[i2]
arr[i2] = temp
}
