一些能想到的算法

冒泡排序
思路:共比较n-1轮,每次比较相邻的两个数,将大数放在后面,经过第一轮比较后最后面的就会是最大的
第二轮除了最后一个比较剩余的,第二轮会将第二大的数放在倒数第二位。直到最后。

插入排序
数组分成两个部分,前半部分是拍好序的,每次取后半部分的第一个数据,依次和前半部分的每个数比较,如果小于向后移,如果大于将数固定在这个下标,后面的部分依次后移
有这样个数组 [1 5 6 3 7 9 4 8]

[1| 5 6 3 7 9 4 8] 分成 1  和后边两个部分(只是抽象上的分成两个部分)
[1 5| 6 3 7 9 4 8] 第一次排序 5>1 放在1的后面 现在分成 [1 5] 和剩下的部分
[1 5 6| 3 7 9 4 8] 第二次排序 6>1 6>5 6放在5的后面 |将数组分成两个部分
[1 3 5 6| 7 9 4 8] 第三次排序 3>1 3<5 将3放在原来5的位置,5 6 依次向后平移。

剩下的就不写了,就是这个意思。代码也好实现,唯一可能有问题的地方就是找到位置后,后面的每一个都需要向后移动一位,只要细心就可以了。

选择排序

第一轮选出最小的放在第一位,第二轮选出剩下的最小的放在第二位。一直到最后。

快速排序

算是上面中比较复杂的一个。
整体的思路选择一个基数,将大于这个基数的放在右边,小于这个基数的放在左边。在从左边的部分选择一个基数,将左边在按照上面的方法分成两部分。直到最终左边只剩两个数后,在依次给右边排序。
这样一个数组 [7 5 10 3 7 9 4 8],一轮一轮的说

第一轮:将7作为基数
先从右边开始找,8>7跳过8
[4l 5 10 3 7 9 4h 8] 4<7 将7换成4 h表示high的位置,这个位置是等待着被替换的
右边找到一个小于基数7的数后在去找左边
[4 5 10l 3 7 9 4h 8] 现在第一个位置是4, 4 5<=7跳过,10大于7,将10的位置标为l(小写的L low)
[4 5 10l 3 7 9 10h 8] 将high的数据(原来的4)换成low的数据(10) 到这里完成依次循环但还没完成第一轮
[4 5 10l 3 7h 9 10 8]] 接下来第二次循环先判断右边大于基数的位置。high的位置继续前移 9>7 跳过,到了7的位置,
一般如果遇到了相同的数,是算在比基数小的部分,就是在判断大于基数时用numbers[high] > temp
判断小于基数时用numbers[low] <= temp,这个temp是基数(这里的原始数据的第一个位置的7)
遇到7不大于基数7,将7的位置标为h
[4 5 7l 3 7h 9 10 8] 将high的数据给low,low的位置由原来的10变成7
[4 5 7 3 7lh 9 10 8] 7<=7 3<=7 现在low high在相同位置跳出循环,将low的位置赋值为基数7。
现在的lh位置的7其实是原数组中第五个位置的7的副本,也就是现在其实并没有原数组中第一个位置的基数7。不要被这两个7弄混了。
假设原数组中第五个位置不是7是6,那么在想在的情况将会是[4 5 6 3 6lh 9 10 8],重复出现两个6,原来的基数在数组中没有了。

到这里第一层排序结束,已经实现基数7的左边<=7,右边>=7,并且基数7已经到了正确的位置。接下来就是按照上面的方法将左边进行排序,在将右边进行排序。贴上java代码

  public static void main(String[] args) {
    int[] numbers = {1, 3, 9, 5, 6, 7, 2, 0, 8, 4, 9};
    QuickSort.quick(numbers);
    for (int i : numbers)
      System.out.print(i + " ");
  }

  public static class QuickSort {
    public static void quick(int[] numbers) {
      if (numbers.length > 0) {
        quickSort(numbers, 0, numbers.length - 1);
      }
    }

    private static void quickSort(int[] numbers, int low, int high) {
      if (low < high) {
        int middle = sortAndGetMiddle(numbers, low, high);
        quickSort(numbers, low, middle - 1);
        quickSort(numbers, middle + 1, high);
      }
    }

    private static int sortAndGetMiddle(int[] numbers, int low, int high) {
      int temp = numbers[low];
      while (low < high) {
        while (low < high && numbers[high] > temp) {
          high--;
        }
        numbers[low] = numbers[high];
        while (low < high && numbers[low] <= temp) {
          low++;
        }
        numbers[high] = numbers[low];
      }
      numbers[low] = temp;
      return low;
    }
  }

快速排序性能比较不稳定,加入是这样的数据[9, 8, 7, 6, 5, 4, 3, 2, 1]那么就成了冒泡。怎么选这个基数可以具体调整。

二差树

平衡二叉树