选择排序:简单选择排序

1. 选择排序思想

(1.1)选择排序的基本思想是:每一趟(例如第i趟)在后面n-i+1(i=1,2, ... , n)个待排序元素中选取关键字最小的元素,作为有序子序列的第i个元素,直到第n-1趟做完,待排序元素只剩下1个,就不用再选了。选择排序中的堆排序算法是重点内容。

2. 简单选择排序的思想

(2.1)从上面选择排序的思想中可以很直观第得出简单选择排序算法的思想:假设排序表为L[1 ... n], 第i趟排序即从L[i ... n]中选择关键字最小的元素与L[i] 交换,每一趟排序可以确定一个元素的最终位置,这样经过n-1趟排序就可以使得整个待排序表有序。

3. 简单选择排序代码实现

复制代码

 1 package cn.sun.it.review;
 2 
 3 import java.util.Arrays;
 4 import java.util.Scanner;
 5 
 6 public class SelectSort {
 7 
 8     public static void main(String[] args) {
 9         System.out.println("请输入若干个整数,以逗号分隔:");
10         Scanner sc = new Scanner(System.in);
11         String strNums = sc.nextLine();
12         String[] tempArrNums = strNums.split(",");
13         int[] arr = new int[tempArrNums.length];
14         for (int i = 0; i < arr.length; i++) {
15             arr[i] = Integer.valueOf(tempArrNums[i]);
16         }
17         System.out.println("排序前:" + Arrays.toString(arr));
18         selectSort_v1(arr);
19         System.out.println("排序后:" + Arrays.toString(arr));
20     }
21 
22     private static void selectSort_v1(int[] arr) {
23         int min;
24         int temp;
25         for(int i=0;i<arr.length-1;i++){ // 一共进行n-1趟排序
26             min = i; // 记录最小元素的位置
27             for(int j=i+1;j<arr.length;j++){ // 在arr[i...n-1]中选择最小的元素
28                 if(arr[j]<arr[min]){ 
29                     min = j; // 更新最小元素的位置
30                 }
31             }
32             if(min != i){ // 与第i个位置进行交换
33                 temp = arr[i];
34                 arr[i] = arr[min];
35                 arr[min] = temp;
36             }
37         }
38     }
39 
40 }

复制代码

4. 测试结果

 

 5. 性能分析

(5.1)空间效率:仅使用常数个辅助单元,故而空间效率为O(1);

(5.2)时间效率:从上述代码中可以看出,在简单选择排序过程中,元素移动的操作次数很少,不会超过3(n-1)次,最好的情况是移动0次,此时对应的表已经有序;但元素间比较的次数与序列的初始状态无关,始终是n(n-1)/2次,所以时间复杂度始终是O(n2)

(5.3)稳定性:在第i趟找到最小的元素后,和第i个元素交换,可能会导致第i个元素与其含有相同关键字元素的相对位置发生改变。例如,表L={2,2,1},经过一趟排序后,

L={1,2,2},最终排序序列也是L={1,2,2},显然,2与2 的相对次序已经发生了变化,因此,简单选择排序是一个不稳定第排序方法。

本文首发于java黑洞网,csdn同步更新

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值