冒泡排序就是依次比较相邻的两个数,将小数放在前面,大数放在后面。

      第一轮:首先比较第1个和第2个数,将小数放前,大数放后;然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后;至此第一轮结束,将最大的数放到了最后。

      第二轮:仍从第一对数开始比较,将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的数),第二轮结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。

      通过上面的分析可以看出,假设需要排序的序列的个数是n,则需要经过n-1轮,最终完成排序。在第一轮中,比较的次数是n-1次,之后每轮减少1次。

      用Java语言实现冒泡排序,可以用双重for循环实现,其核心代码如下。

    10.1.2 插入排序

      插入排序包括直接插入排序、二分插入排序、链表插入排序和希尔排序。接下来介绍最简单的直接插入排序。

      第一轮:比较无序表中前两个数,然后按顺序插入到有序表中,剩下的数仍在无序表中。

      第二轮:把无序表中剩下的第一个数与有序表的两个数进行比较,然后把这个数插入到合适位置。

      按此规律操作,直至无序表中的数全部插入到有序表,完成排序。

    1. for(int i = 1;i < a.length; i++){
    2. int j = -1;
    3. while(j <= i && a[i] > a[++j]){ //找到a[i]应该摆放的位置
    4. if(j < i){
    5. //将j之后的数据移动一位,然后把a[i]移动到j处
    6. int temp = a[i];
    7. for(int k = i-1;k >= j;k--){
    8. a[k+1] = a[k];
    9. a[j] = temp;
    10. }
    11. }
    12. }

      直接插入排序没有充分地利用“已插入的数据已经排序”这个事实,因此有很多针对直接插入排序改进的算法,例如二分插入排序等,这里不再赘述。