• 第7章 快速排序(快速排序,模糊区间排序)


    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    using namespace std;
    void swap(int *a, int i, int j)
    {
        int tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
    }
    int partition(int *a, int p, int r)
    {
    
        //主元随机化
        srand(time(NULL));
        int num = rand() % (r - p + 1) + p;
        swap(a, num, r);
    
    
        int x = a[r], i = p - 1;
        for (int j = p; j < r;++j)
            if (a[j] < x){
                ++i;
                swap(a, i, j);
            }
        swap(a, i + 1, r);
        return i + 1;
    }
    void quickSort(int *a, int p, int r)
    {
        if (p < r){
            int q = partition(a, p, r);
            quickSort(a, p, q - 1);
            quickSort(a, q + 1, r);
        }
    }
    
    
    
    typedef struct _interval{
        int a, b;
    }interval;
    void intervalSwap(interval &x, interval &y)
    {
        interval tmp = x;
        x = y;
        y = tmp;
    }
    int max(int a, int b)
    {
        return a>b ? a : b;
    }
    int min(int a, int b)
    {
        return a < b ? a : b;
    }
    void fuzzyPartition(interval *a, int p, int r, int &x, int &y)
    {
        interval mid = a[r];
        int i, j;
        i = p - 1;
        j = r + 1;
        for (int k = p; k < j; ++k){
            if (a[k].b < mid.a){
                ++i;
                intervalSwap(a[k], a[i]);
            }
            else if (a[k].a > mid.b){
                --j;
                intervalSwap(a[k], a[j]);
                --k;
            }
            else{
                mid.a = max(mid.a, a[k].a);
                mid.b = min(mid.b, a[k].b);
            }
        }
        x = i;
        y = j;
    }
    void fuzzyQuickSort(interval *a, int p, int r)
    {
        if (p < r){
            int x, y;
            fuzzyPartition(a, p, r, x, y);
            fuzzyQuickSort(a, p, x);
            fuzzyQuickSort(a, y, r);
        }
    }
    int main()
    {
        int a[30];
        srand(time(NULL));
        for (int i = 0; i < 30; ++i)
            a[i] = rand() % 1000;
        quickSort(a, 0, 30 - 1);
        for (int i = 0; i < 30; ++i)
            printf("%d	", a[i]);
    
        const int cnt = 5;
        interval r[cnt];
        for (int i = 0; i < cnt; ++i){
            r[i].a = rand() % 100;
            r[i].b = rand() % 1000+100;
        }
        fuzzyQuickSort(r, 0, cnt - 1);
        for (int i = 0; i < cnt; ++i){
            printf("%d	%d
    ", r[i].a, r[i].b);
        }
    }
    View Code

    O(n2)  O(nlgn)  O(nlgn)  O(nlgn)

  • 相关阅读:
    05mybatis配置方式简单入门
    04mybatis配置文件lombok组件使用
    03mybatis-注解方式简单入门实例
    01-02 ssm框架简介
    jsp实现文件上传
    新增的语义化标签
    html5与html4的区别
    面向对象总结
    html语法
    购物车总结
  • 原文地址:https://www.cnblogs.com/jokoz/p/4691396.html
Copyright © 2020-2023  润新知