一,直接插入排序
将前两个个数排序,构成一个有序数列,再将第三个数加入,将三个数进行排序,
构成一个有序数列,再将第四个数加入。。。。直到把第n个数加入,并进行排序
package SortingOrder; import java.util.Arrays; /** * 直接插入排序 * 将前两个个数排序,构成一个有序数列,再将第三个数加入,将三个数进行排序, * 构成一个有序数列,再将第四个数加入。。。。直到把第n个数加入,并进行排序 * 当n <= 50时,适合适用直接插入排序和简单选择排序,如果元素包含的内容过大, * 就不适合直接插入排序,因为直接插入排序需要移动元素的次数比较多. * 当数组基本有序的情况下适合使用直接插入排序和冒泡排序,它们在基本有序的情况下排序的时间复杂度接近O(n). */ public class StraightInsertSort { public static void main(String[] args) { int[] array = {25, 11, 45, 26, 12, 78};//要排序的数组 int length = array.length;//把数组长度单独拿出来,提高效率 for (int i = 1; i < length; i++) { int insertNum = array[i];//要插入的数 int j; for (j = i - 1; j >= 0; j--) { if (array[j] > insertNum) { array[j + 1] = array[j];//若前一个数大于后一个数,将其后移一位 } else { break; } } array[j + 1] = insertNum; } System.out.println(Arrays.toString(array)); } }
时间复杂度:O(n^2)
如果元素的个数过多,就不适合插入排序,因为插入排序移动的元素过多,当数组基本有序时,
适合使用直接插入排序和冒泡排序,基本有序时,排序的时间复杂度接近O(n)
二,希尔排序
直接插入排序的改进,希尔排序也成为“缩小增量排序”,其基本原理是,
现将待排序的数组元素分成多个子序列,
使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插入排序,
待整个待排序列“基本有序”后,最后在对所有元素进行一次直接插入排序。
package SortingOrder; import java.util.Arrays; /** * 希尔排序 * 希尔排序也成为“缩小增量排序”,其基本原理是,现将待排序的数组元素分成多个子序列, * 使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插入排序, * 待整个待排序列“基本有序”后,最后在对所有元素进行一次直接插入排序。 */ public class shellSortSmallToBig { public static void main(String[] args) { int[] array = {26, 53, 67, 48, 57, 13, 48, 32, 60, 50}; test1(array); } public static void test1(int[] array) { System.out.println(Arrays.toString(array)); int j; for (int step = array.length / 2; step > 0; step = step / 2) { System.out.println("step:" + step); for (int i = step; i < array.length; i++) { int temp = array[i]; for (j = i - step; j >= 0; j = j - step) { if (temp < array[j]) { array[j + step] = array[j]; } else { break; } } array[j + step] = temp; } System.out.println(Arrays.toString(array)); } } }
时间复杂度O(n^2)
步长为5时:对a[0]和a[5],a[1]和a[6],a[2]和a[7],。。。进行排序
步长为2时:a[0]和a[2],a[1]和a[3],a[2]和a[4],a[2]和a[0],。。。
。。。。
三,选择排序
在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;
然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,
直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
package SortingOrder; import java.util.Arrays; /** * 选择排顺序 * 第一次遍历: * 将数组中最小的移到最左边 * 第二次遍历: * 将剩余中最小的移动到最左边 * 。。。。。 * 直到将所有数排序 */ public class SelectSort { public static void main(String[] args) { int[] array={1,25,6,2,5,3,73,74,87,34}; test1(array); } public static void test1(int[] array){ int length = array.length; for(int i=0;i<length;i++){ for(int j=i;j<length;j++){ if(array[i]>array[j]){ int temp = array[i]; array[i] = array[j]; array[j] = temp; } } System.out.println(Arrays.toString(array)); } } }
四,冒泡排序
将序列中所有元素两两比较,将最大的放在最后面。
将剩余序列中所有元素两两比较,将最大的放在最后面。
重复第二步,直到只剩下一个数
package SortingOrder; import java.util.Arrays; /** * 将序列中所有元素两两比较,将最大的放在最后面。 * 将剩余序列中所有元素两两比较,将最大的放在最后面。 * 重复第二步,直到只剩下一个数 */ public class BubbleSort { public static void main(String[] args) { int[] array = {26, 53, 67, 48, 57, 13, 48, 32, 60, 50}; test1(array); } public static void test1(int[] array) { for (int i = 0; i < array.length; i++) { for (int j = 0; j < array.length - i - 1; j++) { if (array[j] > array[j + 1]) { int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } System.out.println("第" + (i+1) + "次排序:" + Arrays.toString(array)); } } }
时间复杂度O(n^2)