数据结构之选择排序

本文详细介绍了选择排序算法,包括其基本思想、时间复杂度分析、实现步骤及代码示例。通过实例解析,展示如何通过选择排序对数组进行升序排列。

选择排序(不稳定)

算法思想

每一趟均对数组未排序区间进行排序,将未排序区间的第一个元素和未排序区间的其他元素进行一一比较,找到未排序区间中最小的元素,与第一个元素进行交换。

时间复杂度

  • 最好情况:O(n^2)
  • 最坏情况:O(n^2)
  • 平均复杂度:O(n^2)

实现思路

以arr[7] = {6,4,8,1,9,2,3}为例(默认升序):
先定义一个边界i区分已排序数组和未排序数组,[0,i)表示已排序数组,[i,size)表示未排序数组,定义一个min用于更新未排序数组每次比较较小值的下标,定义一个索引j用于探测未排序数组中的元素。
第一趟排序边界i的初始值为0,所以待排序区间为[0,size),待排序数组为arr = {6,4,8,1,9,2,3}
1.min = 0,j = i +1 = 1,arr[j] = 4 < arr[min] = 6,所以min = 1
2.j++ = 2,arr[j] = 8 !< arr[min] = 4,所以不做改变
3.j++ = 3,arr[j] = 1 < arr[min] = 4,所以min = 3
4.j++ = 4,arr[j] = 9 !< arr[min] = 1,所以不做改变
5.j++ = 5,arr[j] = 2 !< arr[min] = 1,所以不做改变
6.j++ = 6,arr[j] = 3 !< arr[min] = 1,所以不做改变
第一次循环结束,min != i,所以将arr[min]和arr[i]交换,此时数组变为arr = {1,4,8,6,9,2,3}
第二趟排序 i++ = 1,所以待排序区间为[1,size),待排序数组为arr = {4,8,6,9,2,3}
1.min = 1,j = i +1 = 2,arr[j] = 8 !< arr[min] = 4,所以不做改变
2.j++ = 3,arr[j] = 6 !< arr[min] = 4,所以不做改变
3.j++ = 4,arr[j] = 9< arr[min] = 4,所以不做改变
4.j++ = 5,arr[j] = 2 < arr[min] = 4,所以min = 5
5.j++ = 6,arr[j] = 3 !< arr[min] = 2,所以不做改变
第二次循环结束,min != i,所以将arr[min]和arr[i]交换,此时数组变为arr = {2,8,6,9,4,3}
第三趟排序 i++ = 2,所以待排序区间为[2,size),待排序数组为arr = {8,6,9,4,3}
1.min = 2,j = i +1 = 3,arr[j] = 6 < arr[min] = 8,所以min = 3
2.j++ = 4,arr[j] = 9 !< arr[min] = 6,所以不做改变
3.j++ = 5,arr[j] = 4< arr[min] = 6,所以min = 5
4.j++ = 6,arr[j] = 3 < arr[min] = 4,所以min = 6
第三次循环结束,min != i,所以将arr[min]和arr[i]交换,此时数组变为arr = {3,6,9,4,8}
第四趟排序 i++ = 3,所以待排序区间为[3,size),待排序数组为arr = {6,9,4,8}
1.min = 3,j = i +1 = 4,arr[j] = 9 !< arr[min] = 6,所以不做改变
2.j++ = 5,arr[j] = 4 < arr[min] = 6,所以min = 5
3.j++ = 6,arr[j] = 8 !< arr[min] = 6,所以不做改变
第四次循环结束,min != i,所以将arr[min]和arr[i]交换,此时数组变为arr = {4,9,6,8}
第五趟排序 i++ = 4,所以待排序区间为[4,size),待排序数组为arr = {9,6,8}
1.min = 4,j = i +1 = 5,arr[j] = 6 < arr[min] = 9,所以min = 5
2.j++ = 6,arr[j] = 8 !< arr[min] = 6,所以不做改变
第五次循环结束,min != i,所以将arr[min]和arr[i]交换,此时数组变为arr = {6,9,8}
第六趟排序 i++ = 5,所以待排序区间为[5,size),待排序数组为arr = {9,8}
1.min = 5,j = i +1 = 6,arr[j] = 8 < arr[min] = 9,所以min = 6
第六次循环结束,min != i,所以将arr[min]和arr[i]交换,此时数组变为arr = {8,9}
此时i++ = 6,j = i + 1 = 7 !< size = 7,循环结束,数组已经有序

代码实现

package Sort;

public class SelectSort {
    public static void selectSort(int[] arr,int size){
        if(size <= 1){
            return;
        }
        for(int i = 0;i < size;i++){
            int min = i;
            for(int j = i + 1;j < size;j++){
                if(arr[j] < arr[min]){
                    min = j;
                }
            }
            if(min != i){
                int temp = arr[min];
                arr[min] = arr[i];
                arr[i] = temp;
            }
        }
    }

    public static void main(String[] args) {
        int[] arr = {6,4,8,1,9,2,3};
        selectSort(arr,7);
        for(int i:arr){
            System.out.print(i + " ");
        }
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值