1、冒泡排序
顾名思义,冒泡的意思就是,在水里气泡会咕噜咕噜从水下漂至水上。故,冒泡排序就是,每一次确定一个值的位置。这样循环一轮后,每一个数都被交换到了它最终的位置。
例如数组:31,44,11,66,78,56,34,65,17,65,54,21,45
我们将它升序排序:第一遍遍历
31<44,不交换。
44>11,交换位置。数组变成:31,11,44,66,78,56,34,65,17,21,45 继续遍历。
44<66,不发生交换。
66<78,不发生交换。
78>56,交换位置。数组变成:31,11,44,66,56,78,34,65,17,21,45 继续遍历。
78>34,交换位置。数组变成:31,11,44,66,56,34,78,65,17,21,45 继续遍历。
78>65,交换位置。数组变成:31,11,44,66,56,34,65,78,17,21,45 继续遍历。
78>17,交换位置。数组变成:31,11,44,66,56,34,65,17,78,21,45 继续遍历。
78>21,交换位置。数组变成:31,11,44,66,56,34,65,17,21,78,45 继续遍历。
78>65,交换位置。数组变成:31,11,44,66,56,34,65,17,21,45,78 继续遍历。
可以看到,经过一轮的比较,最大值78已经到了它的最终位置。然后进行第二轮,78已经定了,所以第二轮中78 就不用比较了,因此第二轮比较次数减一。这样循环往复,最终我们会得到一个升序的有序序列。代码如下:
min就是我们要排序的数组名。冒泡排序的优化可以 通过增加一个flag变量来标记一轮比较有没有发生交换,如果发生了交换就将flag重新赋值,如果没有交换说明代码数组已然有序,直接break即可!
2、插入排序
插入值排序可以类比我们要在一个有序数组里插入一个值,使它保持降序或者升序。插入排序与之大同小异,区别就是我们要插入的值比较多。
算法描述:在排序的第一步,将数组中第一个数当做一个有序数组(一个数字显然是有序的),然后将这个数组后面的一个值插入到这个数组中。判断它应该插入的位置。插入后,我们就将原来一个数字的数组扩展成了两个数字的有序数组。继续将新数组后面的值插入,即可。
算法过程:数组[97,99,87,65,100,51,43,57]
第一步:将数组的第一个元素97当做我们的目标数组,99是我们要插入的值。降序排列,99>97,因此97向后移动,99存放在97原来的位置。
第二步:目标数组99,97。要插入的值是87,87<97,所以位置不变,数组大小扩充1,变为3。
第三步:目标数组99,97,87.要插入的值是65,65<87,所以位置不变,数组大小扩充1,变为4。
第四步:目标数组99,97,87,65.要插入的值是100,100>65,所以65向后移动,100>87,87向后移动,同理,97,99向后移动,100找到插入位置,插入。数组扩充1,大小为5.
第五步:目标数组100,99,97,87,65.要插入的值是51,51<65,所以位置不变。数组大小扩充为6。
第六步:目标数组100,99,97,87,65,51.要插入的值是43,43<51.所以位置不变,数组大小扩充为7.
第七步:目标数组100,99,97,87,65,51,43.要插入的值是57,57>43,所以43向后移动,57>51,51向后移动 。57<65找到插入位置,将它插在65的后面。
至此,循环结束。得到数组100,99,97,87,65,57,51,43 ,排序完成。
代码: