排序算法总结
排序算法说明
排序的定义
对一序列对象根据关键字排序;
术语说明
稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;
不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;
内排序:所有排序操作都在内存中完成;
外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;
时间复杂度:一个算法执行所耗费的时间。
空间复杂度:运行完一个程序所需内存的大小。
算法总结

图片名词解释:
n: 数据规模
k: “桶”的个数
In-place: 占用常数内存,不占用额外内存
Out-place: 占用额外内存
冒泡排序
算法描述
- 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
- 针对所有的元素重复以上的步骤,除了最后一个;
- 重复步骤1~3,直到排序完成;
(注:每一次比较的结果是最大值)
动图演示

代码演示
/* 冒泡排序*/ public static int[] bubbleSort(int[] array) { if(array.length == 0 || array.length == 1) { return array; } /* 一个长度为N的数组需要冒泡N-1次*/ for (int i = 0; i< array.length - 1 ;i++){ /* 相邻元素比较的次数为总元素N-开始的第一个元素-已经排序的最大元素个数 i*/ for(int j = 0; j < array.length -1 - i;j++) { if (array[j] > array[j+1]) { int temp = array[j+1]; array[j+1] = array[j]; array[j] = temp; } } } return array; }
选择排序
算法描述
- 从数组第一个元素开始,假设第一个元素(n = 1)是最小值;
- 让array[n-1] 与后面的元素依次比较,若碰到array[n-1]>array[i]则交换元素,最后第一个元素就为最小值;
- 第n个元素都重复步骤2,直到排序完成;
(注:每次比较的结果是最小值)
动图演示

代码演示
/* 选择排序*/ public static int[] selectSort(int[] array) { if(array.length == 0 || array.length == 1) { return array; } for (int i = 0; i < array.length; i++) { int minIndex = i; for (int j = i + 1; j < array.length;j++) if (array[j] < array[minIndex]) { /* 始终保持minIndex 指向最小的值*/ minIndex = j; } int temp = array[minIndex]; array[minIndex] = array[i]; array[i] = temp; } return array; }
插入排序
算法描述
- 数组第N个元素(n从2开始),依次向前面的元素比较
- 如果前面的元素大于元素n,则将该元素插到元素n的后面;
- 重复以上步骤,纸质排序完成;
动图演示

代码演示
/* 插入排序*/ public static int[] insertSort(int[] array) { if(array.length == 0 || array.length == 1) { return array; } /* 默认第一个元素已被排序,从第二个元素开始*/ for (int i = 1; i < array.length;i++) /* 依次向前比较,如小于前面的元素,则置换位置*/ for (int j = i - 1; j > = 0 ; j--) { if (array[j] > array[i]) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } } return array; }
快速排序
算法描述
从数列中挑出一个元素,称为 “基准”(pivot);重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序
动图演示

代码演示
/** * 快速排序 * @param array * @param start * @param end * @return */ public static int[] QuickSort(int[] array, int start, int end) { /* 随机设置一个基准值 ,此处选中值*/ int pivot = array[(start + end) /2]; /* 设置左右游标*/ int left = start; int right = end; while (left < right) { /* 左游标向右找,直到找到大于基准值的元素*/ while (array[left] < pivot) { left++; } /* 右游标向找找,直到找到小于基准值的元素*/ while (array[right] > pivot) { right--; } /* 结束条件*/ if(left >= right){ break; } /* 一旦找到左边大于基准值, 或右边小于基准值的元素就交换*/ int temp = array[left]; array[left] = array[right]; array[right] = temp; /* 交换后,左边的值等于基准值,则右游标前移一位,进行下一轮交换*/ if(array[left] == pivot) { right--; } /* 交换后,右边的值等于基准值,则左游标前移一位,进行下一轮交换*/ if (array[right] == pivot) { left++; } } /* 防止栈溢出*/ if (left == right) { left++; right--; } /* 向左递归*/ if(start < right){ QuickSort(array, start, right); } /* 向右递归*/ if(left < end){ QuickSort(array, left, end); } return array; }