目录
1、基本思想
选择排序是一种简单的排序算法,基本原理是从头扫描到尾,找出最小的一个元素于第一个元素交换,接着从剩下的元素中找到最小的一个元素和第二个元素交换,依次类推直到得到一个有序序列为止。
2、算法分析
第一次从 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 次,得到一个从小到大排列的有序序列。
例如:现在有6个元素的序列需要排序 {7,31,23,13,35,3},此时N=6,需要n-1趟排序
3、代码实现
(1)python实现
#!/usr/bin/python3
# -*- coding: utf-8 -*-
def select_sort(data: list[int]) -> None:
for i in range(len(data) - 1):
min_index = i
for j in range(i + 1, len(data)):
if data[j] < data[min_index]:
min_index = j
if min_index != i:
data[i], data[min_index] = data[min_index], data[i]
print(f"第 {i + 1} 轮排序结果:{data}")
def main():
# data = [3,1,5,2,1,0]
data = [7, 31, 23, 13, 35, 3]
print(f"排序前:{data}")
select_sort(data)
print(f"最终结果:{data}")
if __name__ == '__main__':
main()
(2)scala实现
/**
* 选择排序
*/
object SelectSort {
def main(args: Array[String]): Unit = {
val arr = Array(7, 31, 23, 13, 35, 3)
println(s"排序前结果为:${arr.mkString(", ")}")
selectSort(arr)
}
def selectSort(arr:Array[Int]): Unit ={
for( i <- 0 until arr.length - 1){
// 假设第一个角标位置的元素最小
var minIndex = i
var minValue = arr(i)
for(j <- i + 1 until arr.length){
if(minValue > arr(j)){
// 记录最小角标和值
minIndex = j
minValue = arr(j)
}
}
// 交换 i 和 minIndex位置的元素
// 这里没有交换位置操作,实际是赋值操作,因为新的最小值已经被我们记录下了,效率更高
if(minIndex != i){
arr(minIndex) = arr(i)
arr(i) = minValue // 赋值
}
println(s"第 ${i+1} 趟排序:${arr.mkString(", ")}")
}
println(s"排序后结果为:${arr.mkString(", ")}")
}
}
排序前结果为:7, 31, 23, 13, 35, 3
第 1 趟排序:3, 31, 23, 13, 35, 7
第 2 趟排序:3, 7, 23, 13, 35, 31
第 3 趟排序:3, 7, 13, 23, 35, 31
第 4 趟排序:3, 7, 13, 23, 35, 31
第 5 趟排序:3, 7, 13, 23, 31, 35
排序后结果为:3, 7, 13, 23, 31, 35
(3)java实现
public class SelectSort {
public static void main(String[] args) {
int[] arr = {7,31,23,13,35,3};
System.out.println("排序前结果为:"+arr2Str(arr));
selectSort(arr);
}
// 选择排序
public static void selectSort(int[] arr){
for(int i=0; i<arr.length-1; i++){
int minValue = arr[i];
int minIndex = i;
for(int j=i+1; j<arr.length; j++){
if(arr[j] < minValue){
minIndex = j;
minValue = arr[j];
}
}
if(minIndex != i){
arr[minIndex] = arr[i];
arr[i] = minValue;
}
System.out.println("第 " + (i+1) + " 趟排序结果为:"+ arr2Str(arr));
}
System.out.println("排序后结果为:"+ arr2Str(arr));
}
public static String arr2Str(int[] arr){
StringBuffer sb = new StringBuffer();
for(int ele : arr){
if(sb.length()>0){
sb.append(", ");
}
sb.append(ele);
}
return sb.toString();
}
}
排序前结果为:7, 31, 23, 13, 35, 3
第 1 趟排序结果为:3, 31, 23, 13, 35, 7
第 2 趟排序结果为:3, 7, 23, 13, 35, 31
第 3 趟排序结果为:3, 7, 13, 23, 35, 31
第 4 趟排序结果为:3, 7, 13, 23, 35, 31
第 5 趟排序结果为:3, 7, 13, 23, 31, 35
排序后结果为:3, 7, 13, 23, 31, 35