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