选择排序

排序算法
选择排序

例:数组排列。

假设有如下数组:

int[] arr={1000,5,564,8,54546,321,56,6356,23,15345,4313156};

分析:先假设最小值在0这个位置,定义一个最小值minPos=0,然后将1000与后面的数相比较,发现5<1000,所以minPos更新为1.再将5与后面进行对比,发现5就是最小值。然后通过代码实现,得到有如下代码:

int minPos=0;//找出一个最小的目标值
for (int j = 1; j < arr.length; j++)
{
    if (arr[j]<arr[minPos])//实现位置更新当minPos的位置值大于j位置时交换下标位置
    {
        minPos=j;
    }
}
System.out.println("最小值"+minPos);//打印观察对不对

经过如上操作之后,我们应该将对应的值进行交换。所以应该定义temp这个临时变量,去交换值。

int temp=arr[0];
arr[0]=arr[minPos];
arr[minPos]=temp;

经过有如上操作,我们找出第一个数,并将其位置排序到第一个。

然后我们分析后面的数组。发现步骤与上述步骤相同,所以定义一个循环去重复之前的算法。minPos应该与i的变换相同,重整代码逻辑,得到有如下代码:

for (int i = 0; i <arr.length ; i++)
{
    int minPos=i;//找出一个最小的目标值
    for (int j = i+1; j < arr.length; j++)
    {
        if (arr[j]<arr[minPos])//实现位置更新
        {
            minPos=j;
        }
    }
    System.out.println("最小值"+minPos);//打印观察对不对,会每次打印排序

    int temp=arr[i];
    arr[i]=arr[minPos];
    arr[minPos]=temp;
}

加上输出语句,便实现了排序。

//打印排序后的数组
        for (int i = 0; i < arr.length; i++)
        {
            System.out.println(arr[i]);
        }
    }

接下来我们需要对算法进行精细化,去处理边界值,以及对方法们,可以进行封装。最终可以得到如下代码:

public static void main(String[] args)
    {
        int[] arr = {1000, 5, 564, 8, 54546, 321, 56, 6356, 23, 15345, 4313156};

        for (int i = 0; i < arr.length - 1; i++)//实际上外层循环可以少一次
        {
            int minPos = i;//找出一个最小的目标值
            for (int j = i + 1; j < arr.length; j++)
            {
//                if (arr[j]<arr[minPos])//实现位置更新
//                {
//                    minPos=j;
//                }
                minPos = arr[j] < arr[minPos] ? j : minPos;//三目运算符代替if循环
            }
            System.out.println("最小值" + minPos);//打印观察对不对

           change(arr,i,minPos);

            //观察每一步的变化
            System.out.println("这是第" + i + "次的内容");
            print(arr);
        }

    }
    public static void print(int[] arr)
    {
        for (int i = 0; i < arr.length; i++)
        {
            System.out.print(arr[i] + " ");
        }
    }
    public static void change(int[] arr,int i,int j)
    {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

还可以通过同时找到最大值最小值减少一半的遍历,或者同时三个数相比较,也也可以实现循环量的减少。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值