选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,经过和其它元素重整,再依规定(从小到大/从大到小)交换位置后达到排序的目的。
基本思想
- 第一次从R[0]-R[n-1]中选取最小值,与R[0]交换;
- 第二次从R[1]-R[n-1]中选取最小值,与R[1]交换;
- 第三次从R[2]-R[n-1]中选取最小值,与R[2]交换;
- …,第i次从R[i-1]-R[n-1]中选取最小值,与R[i-1]交换;
- …,第n-1次从R[n-2]-R[n-1]中选取最小值,与R[n-2]交换;
- 总共通过n-1次,得到一个按排序码从小到大排列的有序序列。
代码实现
package chapter18.sort
import java.text.SimpleDateFormat
import java.util.Date
object SelectSort {
def main(args: Array[String]): Unit = {
//数组
println("---------------------功能测试-------------------------")
val arr1 = Array(3, 9, -1, 10, 20)
selectSort(arr1)
println(arr1.mkString(" "))
println("---------------------性能测试-------------------------")
//创建一个80000个随机数据的数组
//使用选择时间为3秒
val random = new util.Random()
val arr = new Array[Int](80000)
for (i <- 0 until 80000) { //循环生成随机数
arr(i) = random.nextInt(8000000)
}
println("排序前")
val now: Date = new Date()
val dateFormat: SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
val date = dateFormat.format(now)
println("排序前时间 = " + date) //输出时间
//println(arr.mkString(" "))
selectSort(arr) // 排序
println("排序后")
//println(arr.mkString(" "))
val now2: Date = new Date()
val date2 = dateFormat.format(now2)
println("排序后时间 = " + date2) //输出时间
}
/**
* 选择排序,升序排序
*
* @param arr 待排序数组
*/
def selectSort(arr: Array[Int]): Unit = {
for (i <- 0 until arr.length - 1) {
var min = arr(i)
var minIndex = i
//遍历
for (j <- (i + 1) until arr.length) {
if (min > arr(j)) {
min = arr(j) // 重置min
minIndex = j // 重置minIndex
}
}
//判断是否需要交换
if (minIndex != i) {
arr(minIndex) = arr(i)
arr(i) = min
}
}
}
}