常见的排序算法 (上)
深入理解算法, 会让你很好的理解其他算法思想 ,其实对于算法大多数都是很好理解的
时间复杂度 , 空间复杂度
1. 选择排序
/** * 选择排序 , 从开始位置每次找出最小那个数字, 放到起始位置 ,然后起始位置迭代重复操作 * * @author: <a href='mailto:'>Anthony</a> */ public class SelectSort { private static void sort(int[] arr, int start, int len) { for (int i = start; i < len; ++i) { int min = i; for (int j = i + 1; j < len; ++j) { if (arr[min] > arr[j]) { min = j; } } Common.swap(arr, i, min); } } }
2. 冒泡排序
/** * 冒泡排序 ; 就是将大的数组往上冒(我这里上指的是数组尾端) , 所以冒一次就可以将一个最大的数冒的最上面, 所以不需要每次都全部冒 * * * @author: <a href='mailto:'>Anthony</a> */ public class BubbleSort { private static void sort(int[] arr, int start, int len) { for (int i = start; i < len; i++) { for (int j = start; j < len - start - 1; j++) { if (arr[j] > arr[j + 1]) { Common.swap(arr, j, j + 1); } } } } }
3. 插入排序
/** * 插入排序 比如 2,3,1 数组 , 假如此时到1了进行插入排序, 1先拿出来, 3和1比较大,就向后移动一下,然后2和1比较还是大就继续向后移动, 此时就可以找到合适位置插入了 * * @author: <a href='mailto:'>Anthony</a> */ public class InsertSort { private static void sort(int[] arr) { /** * 空 或者 0 / 1 都直接返回 */ if (null == arr || arr.length <= 1) { return; } // 2 3 1 for (int index = 1; index < arr.length; index++) { // 当前位置 , 开始必须从第二个开始 int temp = arr[index]; // 左边位置 int left = index - 1; // 移动坐标其实就是 ... while (left >= 0 && arr[left] > temp) { // 互换位置 arr[left + 1] = arr[left]; // 向前移动 left--; } // 最后保存数据数据所在位置 arr[left + 1] = temp; } } }
4. 快速排序
他利用递归的思想, 找到一个数, 那个数 ,他左边全部比他小, 右边全部比他大 , 然后无限递归下去 . 就可以快速排序了
/** * 快速排序 * * @author: <a href='mailto:'>Anthony</a> */ public class QuickSort { public static void main(String[] args) { int[] arr_1000 = Common.generate_Arr_1000(); quickSort(arr_1000, 0, arr_1000.length); showarr(arr_1000); } private static void quickSort(int[] arr, int low, int high) { if (low >= high) return; int index = getIndex2(arr, low, high); quickSort(arr, low, index - 1); quickSort(arr, index + 1, high); } /** * 方法一 目的就是找到一个值 , 其实就是low索引所对应的的那个值 * 他的左边全部小于他的右边, 然后返回他的位置, 继续递归 * * @return 返回low对应的数组中的数据, 所应该对应的真正索引位置 */ private static int getIndex(int[] arr, int low, int high) { int tmp = arr[low]; while (low < high) { while (low < high && arr[high] >= tmp) { high--; } arr[low] = arr[high]; while (low < high && arr[low] <= tmp) { low++; } arr[high] = arr[low]; } arr[low] = tmp; return low; } /** * 方法二 : 传统交换方法 和上述一样, 看喜欢用哪个 * * @return */ private static int getIndex2(int[] arr, int low, int high) { int start = low; int tmp = arr[low]; while (low < high) { while (low < high && arr[high] >= tmp) { high--; } while (low < high && arr[low] <= tmp) { low++; } swap(arr, low, high); } // 这里最好自己试一试 arr[start] = arr[low]; // 这里也是想一想就理解了 arr[low] = tmp; return low; } private static void swap(int[] arr, int low, int high) { int temp = arr[low]; arr[low] = arr[high]; arr[high] = temp; } private static void showarr(int[] arr) { int count = 0; for (int i : arr) { count++; System.out.printf("%d\t", i); if (count % 10 == 0) { System.out.println(); } } } }
相关推荐
randy0 2020-11-17
lixiaotao 2020-10-07
美丽的泡沫 2020-09-08
nongfusanquan0 2020-08-18
hang0 2020-08-16
earthhouge 2020-08-15
算法改变人生 2020-07-28
troysps 2020-07-19
Broadview 2020-07-19
chenfei0 2020-07-18
风吹夏天 2020-07-07
yangjingdong00 2020-07-05
数据与算法之美 2020-07-05
shawsun 2020-07-04
数据与算法之美 2020-07-04
要知道时间复杂度只是描述一个增长趋势,复杂度为O的排序算法执行时间不一定比复杂度为O长,因为在计算O时省略了系数、常数、低阶。实际上,在对小规模数据进行排序时,n2的值实际比 knlogn+c还要小。
Evankaka 2020-07-04
田有朋 2020-06-28