• 基础算法——排序


    /*************************************************************************
        > File Name: sort.cpp
        > Author: xinyang
        > Mail: xuechen.xy@gmail.com 
        > Created Time: Mon 05 Oct 2015 11:27:39 PM CST
     ************************************************************************/
    
    #include <iostream>
    using namespace std;
    
    /*
     * 插入排序
     */
    void insert_sort(int A[], int n) {
        if (A == NULL || n <= 0) {
            return ;
        }
    
        for (int i = 1; i < n; ++i) {
            if (A[i] < A[i - 1]) {
                int aim = A[i];
                int j;
                for (j = i - 1; j >= 0; --j) {
                    if (A[j] > aim) {
                        A[j + 1] = A[j];
                    } else {
                        break;
                    }
            }
                A[j + 1] = aim;
            }
        }
    }
    
    /*
     * 冒泡排序
     */
    void bubble_sort(int A[], int n) {
        if (A == NULL || n <= 0) {
            return;
        }
        for (int i = 0; i < n; ++i) {
            bool flag = false;
            for (int j = n - 1; j > i; --j) {
                if (A[j - 1] > A[j]) {
                    int tmp = A[j - 1];
                    A[j - 1] = A[j];
                    A[j] = tmp;
                    flag = true;
                }
            }
            if (false == flag) {
                break;
            }
        }
    }
    
    /*
     * 选择排序
     */
    void select_sort(int A[], int n) {
        if (A == NULL || n <= 0) {
            return ;
        }
    
        for (int i = 0; i < n - 1; ++i) {
            int aim = i;
            for (int j = i + 1; j < n; ++j) {
                if (A[aim] > A[j]) {
                    aim = j;
                }
            }
            if (aim != i) {
                int tmp = A[aim];
                A[aim] = A[i];
                A[i] = tmp;
            }
        }
    }
    
    /*
     * 快速排序
     */
    int partition(int A[], int low, int high) {
        int pivot = A[low];
        while (low < high) {
            while (low < high && A[high] >= pivot) {
                --high;
            }
            A[low] = A[high];
            while (low < high && A[low] <= pivot) {
                ++low;
            }
            A[high] = A[low];
        }
        A[low] = pivot;
        return low;
    }
    
    void quick_sort(int A[], int low, int high) {
        if (low < high) {
            int pivotpos = partition(A, low, high);
            quick_sort(A, low, pivotpos - 1);
            quick_sort(A, pivotpos + 1, high);
        }
    }
    
    void quick_sort(int A[], int n) {
        if (A == NULL || n <= 0) {
            return ;
        }
        int low = 0, high = n - 1;
        quick_sort(A, low, high);
    }
    
    /*
     * 归并排序
     */
    void merge(int A[], int low, int mid, int high) {
        int l_len = mid - low + 1;
        int r_len = high - mid;
        int *left = new int[l_len];
        int *right = new int[r_len];
    
        int l_idx = 0, r_idx = 0, idx = low;
        for (int i = low; i <= mid; ++i) {
            left[l_idx++] = A[i];
        }
        for (int i = mid + 1; i <= high; ++i) {
            right[r_idx++] = A[i];
        }
    
        l_idx = r_idx = 0;
        while (l_idx != l_len && r_idx != r_len) {
            if (left[l_idx] < right[r_idx]) {
                A[idx++] = left[l_idx++];
            } else {
                A[idx++] = right[r_idx++];
            }
        }
        while (l_idx != l_len) {
            A[idx++] = left[l_idx++];
        }
        while (r_idx != r_len) {
            A[idx++] = right[r_idx++];
        }
    }
    
    
    void merge_sort(int A[], int low, int high) {
        if (low < high) {
            int mid = (low + high) / 2;
            merge_sort(A, low, mid);
            merge_sort(A, mid + 1, high);
            merge(A, low, mid, high);
        }
    }
    
    void merge_sort(int A[], int n) {
        if (A == NULL || n <= 0) {
            return ;
        }
        int low = 0, high = n - 1;
        merge_sort(A, low, high);
    }
    
    /*
     * 堆排序
     */
    void adjust_down(int A[], int k, int n) {
        A[0] = A[k];
        for (int i = k * 2; i <= n; i *= 2) {
            if (i < n && A[i] < A[i + 1]) {
                ++i;
            }
            if (A[0] > A[i]) {
                break;
            } else {
                A[i] = A[i];
                k = i;
            }
        }
        A[k] = A[0];
    }
    
    void build_max_heap(int A[], int n) {
        for (int i = n / 2; i >= 1; --i) {
            adjust_down(A, i, n);
        }
    }
    
    void heap_sort(int A[], int n) {
        if (A == NULL || n <= 0) {
            return;
        }
        build_max_heap(A, n);
        for (int i = n; i > 0; --i) {
            int tmp = A[1];
            A[1] = A[i];
            A[i] = tmp;
            adjust_down(A, 1, i - 1);
        }
    }
    
    int main() {
        int A[] = {-1, 3, 8, 7, 1, 2, 5, 6, 4, 9};
        // insert_sort(A, 9);
        // bubble_sort(A, 9);
        // select_sort(A, 9);
        // quick_sort(A, 9);
        merge_sort(A, 9);
        for (int i = 1; i <= 9; ++i) {
            cout << A[i] << ' ';
        }
        cout << endl;
        return 0;
    }
  • 相关阅读:
    1、搭建CICD平台
    Jackson 的 基本用法
    多种方式实现动态替换Android默认桌面Launcher
    Springboot2.x整合Redis以及连接哨兵模式/集群模式
    Redis哨兵(Sentinel)模式
    redis的哨兵模式(redis有密码)
    【数据结构】——LCT(link cut tree)
    征战蓝桥 —— 2017年第八届 —— C/C++A组第3题——魔方状态
    征战蓝桥 —— 2017年第八届 —— C/C++A组第4题——方格分割
    征战蓝桥 —— 2017年第八届 —— C/C++A组第4题——方格分割
  • 原文地址:https://www.cnblogs.com/yiyi-xuechen/p/4858752.html
Copyright © 2020-2023  润新知