C++实现基本排序算法1:插入排序和希尔排序

用C++简单的实现插入和希尔排序,也算是一个笔记吧~

1. 插入排序和希尔排序的原理

  1. “深入理解”—插入排序算法
  2. 白话经典算法系列之二 直接插入排序的三种实现
  3. 白话经典算法系列之三 希尔排序的实现

2.代码

#include <iostream>
#include <vector>

void Swap(std::vector<int>&, int, int);
// 实现直接插入排序算法
void InsertSort(std::vector<int>& unorder_array) {
    for (int i = 1; i < unorder_array.size(); ++i) {
        int temp = unorder_array[i];    // 保存中间变量
        int j;
        for (j = i - 1; j >= 0 && unorder_array[j] > temp; --j) {
            unorder_array[j + 1] = unorder_array[j];    // 向后移动哈
        }
        unorder_array[j + 1] = temp;
    }
}

// 希尔排序1:使用交换方法。分组进行插入排序,交换法使用希尔增量[length/2, length/4,...]
void ShellSortSwap(std::vector<int>& unorder_array) {
    for (int gap = unorder_array.size() >> 1; gap > 0; gap = gap >> 1) {    // 注意这里的for的第三个参数是一个表达式是gap = gap >> 1,而不是直接是gap >> 1
        for (int i = gap; i < unorder_array.size(); ++i) {
            int j = i;
            while (j - gap >= 0 && unorder_array[j] < unorder_array[j - gap]) {
                Swap(unorder_array, j, j - gap);
                j  = j - gap;
            }
        }
    }
}

//希尔排序2:使用移动方法。
void ShellSortMove(std::vector<int>& unorder_array) {
    for (int gap = unorder_array.size() >> 1; gap > 0; gap = gap >> 1) {
        for (int i = gap; i < unorder_array.size(); ++i) {
            if (unorder_array[i] < unorder_array[i - gap]) {    // 在希尔排序的内部使用直接插入排序
                int temp = unorder_array[i];    // 保存当前需要插入的数据
                int k = i - gap;    // 当前需要插入之前一个元素
                while (k >=0 && temp < unorder_array[k]) {
                    unorder_array[k + gap] = unorder_array[k];
                    k = k - gap;
                }
                unorder_array[k + gap] = temp;  // 插入数据
            }
        }
    }
}
// 交换二个变量
void Swap(std::vector<int>& unorder_array, int a, int b) {  // 交换数据,不使用中间变量
    unorder_array[a] = unorder_array[a] + unorder_array[b]; // 注意这里是unorder_array[b]而不是b
    unorder_array[b] = unorder_array[a] - unorder_array[b];
    unorder_array[a] = unorder_array[a] - unorder_array[b];

}

int main()
{
    std::vector<int> unorder_array;
    int data;
    std::cin >> data;
    unorder_array.push_back(data);
    while (std::cin.get() != '\n') {
        std::cin >> data;
        unorder_array.push_back(data);
    }
    std::cout << "orgin seq is: ";
    for (auto it = unorder_array.begin(); it != unorder_array.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << "\n";
    ShellSortSwap(unorder_array);	// 这里可以选择InsertSort or ShellSortSwap or ShellSortMove
    std::cout << "insert sort is: ";
    for (int i = 0; i < unorder_array.size(); ++i) {
        std::cout << unorder_array[i] << " ";
    }
    return 0;
}

在这里插入图片描述

只是用来放代码的,以后可以找的到。

猜你喜欢

转载自blog.csdn.net/alxe_made/article/details/88838055