首页 > 技术文章 > java选择排序

hty20010101 2021-12-03 13:37 原文

java选择排序

算法思想

每一次从这堆“参与比较的数据当中”找出最小(大)值,拿着这个最小(大)值和“参与比较的这堆最前面的元素”交换位置。

算法步骤

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

重复第二步,直到所有元素均排序完毕。

 

 

代码(此处实现是”找出最小值,拿着这个最小值和“参与比较的这堆最前面的元素”交换位置。)

 for(int i = 0; i < arr.length - 1; i++){
  // 假设起点i下标位置上的元素是最小的。
  int min = i;
  for(int j = i + 1; j < arr.length; j++){
    if(arr[j] < arr[min]){
      min = j; //最小值的元素下标是j
    }
  }
  // 当i和min相等时,表示最初猜测是对的。
  // 当i和min不相等时,表示最初猜测是错的,有比这个元素更小的元素,
  // 需要拿着这个更小的元素和最左边的元素交换位置。
  if(min != i){
    // 表示存在更小的数据
    // arr[min] 最小的数据
    // arr[i] 最前面的数据
    int temp = arr[min];
    arr[min] = arr[i];
    arr[i] = temp;
  }
 }

比较次数:(n*(n - 1)) / 2

 

过程

参与比较的数据:3 1 6 2 5 (这一堆参加比较的数据中最左边的元素下标是0)

第1次循环之后的结果是:

1 3 6 2 5

 

参与比较的数据:3 6 2 5 (这一堆参加比较的数据中最左边的元素下标是1)

第2次循环之后的结果是:

2 6 3 5

 

参与比较的数据:6 3 5 (这一堆参加比较的数据中最左边的元素下标是2)

第3次循环之后的结果是:

3 6 5

 

参与比较的数据:6 5 (这一堆参加比较的数据中最左边的元素下标是3)

第4次循环之后的结果是:

5 6

循环次数: n - 1

 

注意:

冒泡排序和选择排序实际上比较的次数没变。只是交换位置的次数减少了。

选择排序比冒泡排序好在:每一次的交换位置都是有意义的。

推荐阅读