冒泡排序(Bubble Sort),是一类“交换”类排序方法,类似水中冒泡,最大的数据会沉到水底,较小的数会浮上来。很简单,以从小到大排序为例,每一趟排序将“逆序”(前一个元素比后一个元素大)相邻两个数据元素交换,这样就会将最大的元素交换到“最后”的位置,冒泡排序每趟子排序过程都会将当前“最大”元素交换到最后位置,较小的元素会渐渐排到前面。
算法描述- 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
- 针对所有的元素重复以上的步骤,除了最后一个;
- 重复步骤1~3,直到排序完成。
自理解:
排序开始
第一轮 两两比较开始,前比后大,则调换
第一轮总结:
1 经过第一轮从左到右两两比较,最大的数被推到了最后的位置
2.那么接下来的排序则不需要遍历到最后一位,因为最大的1个值已经被排到了最后
第二轮排序开始: 图略
第二轮总结:
1. 由于不考虑已经排序好的128,第二轮已经将除最后一位之前(leng-1-1)的数组中最大值交换到了最后位置
2. 那么接下来的排序则不需要遍历到最后2位,因为最大的2个值已经被排到了最后
第三轮排序开始:略
第四轮排序开始:略
第五轮排序开始:略
代码实现
算法分析
2. 简单选择排序(Selection Sort)
简单选择排序很直观,直接从待排序列表中找出最小(或最大)的元素放到有序序列中,直到待排序列表中的元素被选择完为止。
算法描述第一趟,从 n 个元素中找出关键字最小的元素与第一个元素交换;
第二趟,在从第二个元素开始的 n-1 个元素中再选出关键字最小的元素与第二个元素交换;
如此,第 k 趟,则从第 k 个元素开始的 n-k+1 个元素中选出关键字最小的元素与第 k 个元素交换,直到整个序列按关键字有序。
3. 直接插入排序(Insertion Sort)
从小到大排列,从第二个元素开始,将后面的元素插入到已经按顺序排好的序列中
算法描述一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
- 从第一个元素开始,该元素可以认为已经被排序;
- 取出下一个元素,在已经排序的元素序列中从后向前扫描;
- 如果该元素(已排序)大于新元素,将该元素移到下一位置;
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
- 将新元素插入到该位置后;
- 重复步骤2~5。
代码实现
6. 快速排序(Quick Sort)
快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
算法描述快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:
- 从数列中挑出一个元素,称为 “基准”(pivot);
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。



