一,直接插入排序
将前两个个数排序,构成一个有序数列,再将第三个数加入,将三个数进行排序,
构成一个有序数列,再将第四个数加入。。。。直到把第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;iarray[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)