数据结构和算法分析

数据结构和算法分析

1. 常见排序算法及其稳定性分析

  • 稳定性含义:两个相等的数值,在排序前后的前后位置不发生变化
  • 稳定性好处:从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用;这样有可能减轻系统的开销

1.1 稳定性排序算法

1.1.1 冒泡排序:

/**
 * 原始冒泡
 * @param num
 */
public static void bubbleSortOne(int num[]) {
    for (int i = 0; i < num.length; i++) {
        for (int j = 1; j < num.length-i; j++) 			{
            if (num[j-1] > num[j]) {
                swap(num, j-1, j);
            }
        }
    }
}

/**
 * 冒泡优化
 * 添加标志位,在不存在交换时退出循环
 * 如果提前完成排序,则无需再继续循环
 * @param num
 */
public static void bubbleSortTwo(int num[]) {
    boolean flag = true;
    int number = num.length;
    while (flag) {
        flag = false;
        for (int i = 1; i < number; i++) {
            if (num[i - 1] > num[i]) {
                swap(num, i - 1, i);
                flag = true;
            }
        }
        number--;
    }
}

/**
 * 冒泡更优化
 * flag用来记录每次for循环的最后的交换位置
 * 因为可能出现数组中元素部分有序
 * 所以每次循环并不是把k值减一,而是直接用最后的交换位置即可(因为后面的已经排好序)
 * @param num
 */
public static void bubbleSortThree(int num[]) {
    int flag = num.length;
    int k;
    while (flag > 0) {
        k = flag;
        flag = 0;
        for (int i = 1; i < k; i++) {
            if (num[i - 1] > num[i]) {
                swap(num, i - 1, i);
                flag = i;
            }
        }
    }

}
/**
 * 交换值
 * @param num
 * @param i
 * @param j
 */
public static void swap(int num[],int i,int j) {
    int temp;
    temp = num[i];
    num[i] = num[j];
    num[j] = temp;
}

1.1.2 插入排序


1.1.3 归并排序


1.1.4 基数排序


1.2 不稳定排序算法

1.2.1 选择排序



1.2.2 快速排序


1.2.3 希尔排序


1.2.4 堆排序


打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,一毛也是爱

打开微信或者支付宝扫一扫,即可进行扫码打赏哦