过程分析
每次都从数据中选出最大或最小的元素
步骤分析
-
先从全部数据中选出最小的元素,放到第一个元素的位置(选出最小元素和第一位位置交换位置);
-
然后再从除了第一个元素的剩余元素中再选出最小的元素,然后放到数组的第二个位置上。
-
循环重复上面的步骤,最终选出来的数据都放前面了,数据就排好序了。
动图演示
代码示例
package PracticeReview.Algorithm;
/**
* 选择排序算法演示
* @since JDK 1.8
* @date 2021/08/16
* @author Lucifer
*/
public class ChooseSort {
public static void chooseSort(int[] arr){
//遍历数组索引寻找最小值
for (int i=0; i<arr.length; i++){
//设定遍历的值
int min = i;
//从i的下一位和i进行比较,如果比i大就将两个值huanweizhi
for (int j=i+1; j<arr.length; j++){
if (arr[j]<arr[min]){
//交换二者下标
min = j;
}
}
//如果最小值的下标不等于i了,那么将最小值与i位置的数据替换,即将最小值放到数组前面来,然后循环整个操作。
if (min!=i){
//用的是冒泡排序的思想
int temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
//增强for循环读取值
for (int num : arr){
System.out.println(num);
}
}
public static void main(String[] args) {
chooseSort(new int[]{1,3,5,2,7,4,9,8});
}
}
go实现:
package main
import "fmt"
var (
chooseArray []int
)
func main() {
chooseArray = []int{3,6,7,1,2,5}
chooseSort(chooseArray)
}
func chooseSort(arr []int) {
for i := 0; i < len(arr); i++ {
//找到最小值--->这里的i是假设下表i为最小。实际交换的一直是数组下标
//之所以这样赋值是保证每次循环进来比较的都会从排好序的下一位开始比较
min := i
//从i的下一位开始循环和i进行比较
for j := i+1; j < len(arr); j++ {
if arr[j] < arr[min] {
//下标交换
min = j
}
}
//判断如果最小值!=i了,将最小值与i位置进行数据替换,将最小值放到数组前面来
if min != i {
//使用冒泡排序的交换值得方法
temp := arr[i]
arr[i] = arr[min]
arr[min] = temp
}
}
//打印出排序好得值
for i, j := range arr {
fmt.Println("索引", i, "得值为:", j)
}
}