剖析 选择排序算法 心里历程

大概思想:

1 选择排序的主要思想就是,经过一次的遍历,通过数据的对比,找到这一次的最小元素的下标,然后把该元素与第一个元素进行替换。

2 把游标向后一位,然后把第二位的元素为基准,通过遍历循环 查找第二大小元素的坐标,然后把该最小元素的坐标,放到前面第二位

3游标在向后一位,第三位为基准,通过遍历查找第三小元素的坐标,把最小的元素,放到前面第三位

........................

思想很简单但是,我们知道从抽象的概念到具体的代码实现还是有一定的差距的,那我接下来我就带领大家一步一步的去探索,由思想到具体的代码的编程解题思想过程,其中一定有很多的试错过程。希望经过这样的一步一步的分析可以给大家提供一个思维模式,因为我们平日里都是背算法,结果呢 背了一遍 忘一遍。在背后我发现主要是,我们在书写算法的过程中省略了前人的思想过程,我们都是由已只 -> 到未知。 但是现实的例子却是有未知到已知的过程。下面就开始吧。

首先我们要准备一个数组,做饭没有米怎么行呢

array [] = {1,3,23,44,2,43,56,33,55}

如何找到最小的元素的下标,这个问题相对而言应该很简单吧

凭着感觉写

for(int i = 0;i< length;i++){ (1)

     int minIndex =i(3) //为什么要赋值i呢,其实我们可以不进行赋值,后面的推倒过程,也会得到这个结论

    if(array[i+1]<array[i]){   (2)//比较前两个元素,找到了一个小的元素,然后呢,是否需要记录一下小元素的坐标,定义一个临时变量

        minIndex = i+1;

    }

}

上面第一次的循环我们可以找到最小值是i+1 也就是array[1]

但是进行第二次的循环的时候我们就会发现有问题了 ,问题诡异在(2) 比较的是后面的两个连续的数进行比较,执行完了,这一次的最小元素的坐标,会冲刷掉第一次的最小节点,这一次的是否是最小不确定,因为这一次的最小值没有和第一次的进行比较。

那么该怎么办呢,其实同一个问题有不同的解决方式,我们之前看到现成的解题答案也是其中的一种,于是为了符合答案,我就选择一种符合答案的一个解题思路。 其实(2)的过程每一次对比都应该和当前遍历过程最小的元素做比较,因此我们可以改成如下:

int minIndex =i(3) //为什么要赋值i呢,其实我们可以不进行赋值,后面的推倒过程,也会得到这个结论

for(int i = 0;i< length;i++){ (1)

    if(array[i+1]<array[minIndex]){   (2)//比较前两个元素,找到了一个小的元素,然后呢,是否需要记录一下小元素的坐标,定义一个临时变量

        minIndex = i+1;

    }

}

没错就是把和最小的坐标做比较。有些人会发觉这个不是必须的吗?,这个就是人与人之间的差异,第一次吃螃蟹的人很痛苦,但是有些路必须要走。我们的人生就是一次一次的做选择。如果你聪明一点,可能就会少走一些弯路。

接下来怎么办,我们已经找到了最小的一个数,这个数放在哪里,按照常理应该放在最前面,我们算法空间是n(1),所以需要和第一个数组进行调换位置。

 int minIndex =i(3) //为什么要赋值i呢,其实我们可以不进行赋值,后面的推倒过程,也会得到这个结论

for(int i = 0;i< length;i++){ (1)

    if(array[i+1]<array[minIndex]){   (2)//比较前两个元素,找到了一个小的元素,然后呢,是否需要记录一下小元素的坐标,定义一个临时变量

        minIndex = i+1;

    }

swap(array[0],array[minIndex]); //经过这一步我们已经成功的把最小的元素放到了第一位置

}

接下来我们需要做的就是把第二小的元素放到,开始的第二个位置。接下来应该如何做呢。没错我们需要一个游标,或者不用游标,我们会想到,把for(int i =1,i<length;i++),i 初始值加一就好了,如果我们有n个元素 我们会书写 n遍,因此我们需要一个循环,做游标递推使用,如下面:

for (int j =0;j<length;j++){

    int minIndex =i(3) //为什么要赋值i呢,其实我们可以不进行赋值,后面的推倒过程,也会得到这个结论

    for(int i = j+1;i< length;i++){ (1) //

        if(array[i]<array[minIndex]){   (2)//比较前两个元素,找到了一个小的元素,然后呢,是否需要记录一下小元素的坐标,定义一个临时变量

            minIndex = i+1;

        }

    swap(array[j],array[minIndex]); //经过这一步我们已经成功的把最小的元素放到了第一位置//每一遍都会交换array[ j ],也就是拍好序列的前面。

}

 

总结:第一个吃螃蟹的人总是最厉害了,通过这一思想过程,可以给大家一点启发,抛砖引玉的作用。有些时候,看懂了不算什么,只有自己真正的做了,才会有所收获,希望我们都不要做接受知识的机器,而是成为创造的机器。站在巨人的肩膀上才能走的更远。

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值