冒泡排序
外循环会从数组的第一位迭代至最后一位,它控制了在数组中经过多少轮排序,每一轮比较都会把数组中最大的数放到最后。
下面的内循环代码中 减去了 i 是因为减去外循环中已经跑过的轮数,就可以避免内循环中所有不必要的比较。
1 | // 冒泡排序 |
选择排序
选择排序算法是一种原址比较排序算法。大致思路是找到数据结构中的最小值并将其放置在第一位,接着找到第二小的值并将其放在第二位,以此类推。
下面代码中 minIndex
记录的是每一轮最小值的位置,内循环选出 minIndex
后外循环进行交换,一共需要进行 len - 1
轮
1 | // 选择排序 |
插入排序
原理很简单,就像打扑克牌的时候一样按顺序整理牌。如果后一个大于前一个,那么就插入,小于的话就不做交换。
从第一个元素开始,该元素可以认为已经被排序;
取出下一个元素,在已经排序的元素序列中从后向前扫描;
如果该元素(已排序)大于新元素,将该元素移到下一位置;
重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
将新元素插入到该位置后;
重复步骤2~5。
1 | // 插入排序 |
希尔排序
1 | // 希尔排序 |
归并排序
分而治之思想的算法应用:算法首先将原始数组分割直至只有一个元素的子数组,然后开始归并。
把长度为n的输入序列分成两个长度为n/2的子序列;
对这两个子序列分别采用归并排序;
将两个排序好的子序列合并成一个最终的排序序列。
1 | // 归并排序 |
快速排序
分而治之思想在排序算法上的典型应用
从数列中挑出一个元素,称为 “基准”(pivot);
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
1 | // 快速排序 |
参考