图解
1. 选择排序
/* * 选择排序 * * 在未排序序列中找到最小元素,存放到排序序列的起始位置 再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。 * 以此类推,直到所有元素均排序完毕。 */ int[] num = {2,3,1,5,4}; //控制遍历次数 for (int i = 0; i < num.length-1; i++) { //记录每次遍历的起始下标位置,默认为最小值 int minIndex = i; for (int j = i+1; j < num.length; j++) { if (num[j]
2. 冒泡排序
/* * 冒泡排序 * * 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 * 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 */ int[] num1 = {1,3,4,6,2,11,19,2,7,0}; // 控制遍历次数 for (int i = 0; i < num1.length-1; i++) { int temp = 0; //控制每次遍历比较次数 for (int j = 0; j < num1.length-1; j++) { //如果后一个数更小就和前一个数交换值 if (num1[j+1]
3. 直接插入排序
/* * 直接插入排序 * * 从第一个元素开始,该元素可以认为已经被排序 * 取出下一个元素,在已经排序的元素序列中从后向前扫描 * 如果前面元素大,则前面元素向后移一位 * 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 * 将新元素插入到该位置中 * 重复步骤2 */ int[] num2 = {3, 4, 2, 1, 5, 6, 9, 8, 7, 0 }; //控制遍历次数 for (int i = 1; i < num2.length; i++) { int temp = num2[i]; int j = i; for (j = i; j > 0 && temp < num2[j-1]; j--) { //num[2] = 2时 //j=2;num2[2]=num2[1];3 4 4 ...;j=1;继续内层循环 //j=1;num2[1]=num2[0];3 3 4 ...;j=0;跳出内层循环 num2[j] = num2[j-1]; } //j=0;num[0]=2;2,3,4... num2[j] = temp; //打印每次移动后的数组 System.out.println("第"+i+"次移动后的数组:"); for (int k : num2) { System.out.print(k+" "); } System.out.println(); } //输出 System.out.println("经过直接插入排序之后的数组:"); for (int i : num2) { System.out.print(i+" "); }
4. 阶乘
/* * 阶乘的方法递归算法 * * 1! = 1 * 2! = 2 x 1 = 2 x 1! * 3! = 3 x 2 x 1 = 3 x 2! * 4! = 4 x 3 x 2 x 1 = 4 x 3! * ...... */ static int factorial(int n) { // return n*(n-1)! if (n < 1) { return 0; } if (n == 1) { return 1; } else { return n * factorial(n - 1); }}
5. 归并排序
/* (1)申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 (2)设定两个指针,最初位置分别为两个已经排序序列的起始位置 (3)比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 (4)重复步骤3直到某一指针达到序列尾 (5)将另一序列剩下的所有元素直接复制到合并序列尾*/public static void merge(int[] num, int low, int mid, int high) { int[] temp = new int[high - low + 1]; int left = low;// 左边数组的起始位置 int right = mid + 1;// 右边数组的起始位置 int index = 0; // 比较拆分的两个子数组,依次取最小值,放入新数组,并移动指针到后一位 while (left <= mid && right <= high) { if (num[left] < num[right]) { temp[index++] = num[left++]; } else { temp[index++] = num[right++]; } } // 把左边剩余的数移入数组 while (left <= mid) { temp[index++] = num[left++]; } // 把右边边剩余的数移入数组 while (right <= high) { temp[index++] = num[right++]; } // 把新数组中的数覆盖nums数组 for (int i = 0; i < temp.length; i++) { num[i + low] = temp[i]; } System.out.println(Arrays.toString(temp));}public static int[] mergeSort(int[] num, int low, int high) { int mid = (low + high) / 2; if (low < high) { // 递归拆分左边 mergeSort(num, low, mid); // 递归拆分右边 mergeSort(num, mid + 1, high); // 左右归并,将拆分的有序数组排序 merge(num, low, mid, high); System.out.println(Arrays.toString(num)); } return num;}public static void main(String[] args) { int[] num3 = {14,12,15,13,11,16}; int[] num0 = mergeSort(num3, 0, num3.length-1); System.out.println("排序结果:" + Arrays.toString(num0));}