初等排序_学习笔记

初等排序_学习笔记

插入排序

  • 将开头元素视作已排序;
  • 执行下述处理,直至未排序不部分消失;
    • 取出未排序部分的开头元素赋给变量v;
    • 在已排序部分,将所有比v大的元素向后移动一个单位;
    • 将已取出的元素v插入空位。
void insertSort(int A[], int len) {
    int i, j, v;
    for (i=1; i<len; i++) {
        v = A[i];
        j = i-1;
        while (j>=0 && A[j]>v) {
            A[j+1] = A[j];
            --j;
        }
        A[j+1] = v;
    }
}
  • 插入排序是稳定算法,算法复杂度为O(N^2);

冒泡排序

  • 重复执行下述操作,直至数组中不包括顺序相反的相邻元素;
    • 从数组末尾开始依此比较相邻两个元素,如果大小关系相反则交换位置;
void bubbleSort(int A[], int N) {
    bool flag = 1;
    for (int i=0; flag; i++) {
        flag = 0;
        for (int j=N-1; j>=i+1; j--) {
            // 这里如果换成<=,将会破坏算法稳定性;
            if (A[j]<A[j-1]) {
                // 交换前后顺序
                swap(A[j], A[j-1]);
                flag = 1;
            }
        }
    }
}
  • 冒泡算法是稳定算法,算法复杂度为O(N^2);

选择排序

  • 重复执行N-1次下述操作:
    • 找出未排序部分最小值的位置minj;
    • 将minj位置的元素与未排序部分的起始元素交换。
void selectSort(int A[], int N) {
    int i, j, t, minj;
    for (i=0; i<N-1; i++) {
        minj = i;
        // 选择未排序中的最小值的位置minj
        for (j=i; j<N; j++) {
            if (A[j]<A[minj]) minj = j;
        }
        // 交换A[i]和A[minj]
        t = A[i]; A[i] = A[minj]; A[minj] = t;
    }
}
  • 选择排序是不稳定算法;算法复杂度为O(N^2);

初等排序方法总结

  • 冒泡排序和选择排序不依赖于数据,即算法复杂度不受输入数据的影响;
  • 插入排序算法时间复杂度依赖与数据,处理某些数据时具有很高的效率;

猜你喜欢

转载自www.cnblogs.com/sakurapiggy/p/13377128.html