• 双向冒泡


    //双向冒泡
    void  DoubleBubble(ElemType A[], int n) {
        int i,temp;
        int low = 0, high = n - 1;
        int flag = 1;//一次冒泡后记录元素是否交换标志
        while (low < high&&flag) {//循环跳出条件中当flag=0时说明已没有逆序
            flag = 0;
            for(i=low;i<high;i++)
                if (A[i] > A[i + 1]) {
                    temp = A[i+1];
                    A[i + 1] = A[i];
                    A[i] = temp;
                    flag = 1;
                }
            high--;
            for(i=high;i>low;i--)
                if (A[i] < A[i - 1]) {
                    temp = A[i - 1];
                    A[i - 1] = A[i];
                    A[i] = temp;
                    flag = 1;
                }
            low++;
        }
    }
    //把所有奇数移到偶数前,先从前向后找到一个偶数元素,再从后向前找到一个奇数元素
    void move(ElemType A[], int len) {
        int temp;
        int i = 0, j = len - 1;
        while (i < j) {
            while (i < j && A[i] % 2 != 0)
                i++;
            while (i < j && A[j] % 2 != 1)
                j--;
            if (i < j) {
                temp = A[i];
                A[i] = A[j];
                A[j] = temp;
                i++;
                j--;
            }
        }
    }
    //随机求出枢轴的下标,然后将枢轴值与A[low]交换
    int Partition(ElemType A[], int low, int high) {
        int rand_Index = low + rand() % (high - low + 1);
        swap(A[rand_Index],A[low]);
        ElemType pivot = A[low];
        int i = low;
        for (int j = low + 1; j <=high; j++)
            if (A[j] < pivot)
                swap(A[++i], A[j]);
        swap(A[i], A[low]);
        return i;        
    }
    //找出第k小的元素
    int Mink(int A[], int low, int high, int k) {
        int pivot = A[low];
        int low_temp = low;
        int high_temp = high;
        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;
        if (low == k)
            return A[low];
        else if (low > k)
            return Mink(A, low_temp, low - 1, k);
        else
            return Mink(A, low + 1, high_temp, k);
    }
    int SetPartition(int A[], int n) {
        int pivotkey, low = 0, low0 = 0, high = n - 1, high0 = n - 1, flag = 1, k = n / 2, i;
        int s1 = 0, s2 = 0;
        while (flag) {
            pivotkey = A[low];
            while (low < high) {
                while (low < high && A[high] >= pivotkey)
                    --high;
                if (low != high)
                    A[low] = A[high];
                while (low < high && A[low] <= pivotkey)
                    ++low;
                if (low != high)
                    A[high] = A[low];
            }
            A[low] = pivotkey;
            if (low == k - 1)
                flag = 0;
            else {
                if (low < k - 1) {
                    low0 = ++low;
                    high = high0;
                }
                else {
                    high0 = --high;
                    low = low0;
                }
            }
        }
        for (i = 0; i < k; i++)
            s1 += A[i];
        for (i = k; i < n; i++)
            s2 += A[i];
        return s2 - s1;
    }
    typedef enum{RED,WHITE,BLUE} color;
    void Flag_Arrange(color A[], int n) {
        int i = 0, j = 0, k = n - 1;
        while(j<=k)
            switch (A[j]) {
            case RED:
                swap(A[i], A[j]);
                i++;
                j++;
                break;
            case WHITE:
                j++;
                break;
            case BLUE:swap(a[j], a[k]);
                k--;
            }
    }
    努力的意义就是放眼望去以后都是喜欢的人和事......
  • 相关阅读:
    (判断是否为弱联通分量) poj 2762
    (最大生成树) poj 1979
    (暴力) bzoj 2208
    (BFS) bzoj 1102
    (并查集) bzoj 1161
    (数学) bzoj 1800
    (博弈) bzoj 2460
    (dinic) poj 3469
    (双端队列优化的SPFA) bzoj 2100
    (判断负环) bzoj 2019
  • 原文地址:https://www.cnblogs.com/Lorrained/p/15243946.html
Copyright © 2020-2023  润新知