• 快速排序


      快速排序是一种时间复杂度不太稳定的排序算法,是一种分治思想的排序算法。

      这篇就谈一下随机化版本的快速排序的问题,所以快排就给个代码,表示学过了:

    /**
     *    快速排序(QuickSort)
     */
    #include <stdio.h>
    
    static int SortByParts(int* nums, int prev, int rear)
    {
        int i, j;
        int temp;
        int x = nums[rear];
    
        j = prev - 1;
        for(i = prev; i < rear; i++)
        {
            if(nums[i] < x)
            {
                temp = nums[i];
                nums[i] = nums[++j];
                nums[j] = temp;
            }
        }
        temp = nums[rear];
        nums[rear] = nums[j + 1];
        nums[j + 1] = temp;
    
        return j + 1;
    }
    
    void QuickSort(int* nums, int prev, int rear)
    {
        int n;
    
        if(prev < rear)
        {
            n = SortByParts(nums, prev, rear);
            QuickSort(nums, prev, n - 1);
            QuickSort(nums, n + 1, rear);
        }
    }
    
    int main()
    {
        int arr[] = {2,8,7,1,3,5,6,4}, *nums = arr;
        int i;
    
        QuickSort(nums, 0, sizeof(arr)/sizeof(int) - 1);
        for(i = 0; i < sizeof(arr)/sizeof(int); i++)
            printf("%d ", arr[i]);
        printf("
    ");
    
        return 0;
    }

       随机化版本的快速排序,我比较迷惑的是产生随机数代码的地方,先看看代码(注释的部分):

    #include <cstdio>
    #include <cstdlib>
    #include <ctime>
    
    static int Random();
    static int RandomizedControl();
    static int ArrayByParts();
    void QuickSort();
    
    static int Random(int prev, int rear)
    {
        return prev + rand()%(rear + 1 - prev);        // 为什么不能是 rand()%(rear + 1 - prev) or rand()%(rear + 1)?
    }
    
    static int RandomizedControl(int* nums, int prev, int rear)
    {
        int i = Random(prev, rear);
        int temp;
    
        temp = nums[i];
        nums[i] = nums[rear];
        nums[rear] = temp;
    
        return ArrayByParts(nums, prev, rear);
    }
    
    static int ArrayByParts(int* nums, int prev, int rear)
    {
        int x = nums[rear];
        int temp;
        int i, j;
    
        j = prev - 1;
        for(i = prev; i < rear; i++)
        {
            if(nums[i] < x)
            {
                temp = nums[i];
                nums[i] = nums[++j];
                nums[j] = temp;
            }
        }
        temp = nums[rear];
        nums[rear] = nums[j + 1];
        nums[j + 1] = temp;
    
        return j + 1;
    }
    
    void QuickSort(int * nums, int start, int end)
    {
        int mid;
    
        if(start < end)
        {
            mid = RandomizedControl(nums, start, end);
            QuickSort(nums, start, mid - 1);
            QuickSort(nums, mid + 1, end);
        }
    }
    
    int main(void)
    {
        int arr[] = {13,-3,-25,20,-16,-23,18,-7,12,-5,-22,15,-4,7}, * nums = arr;
        int i;
    
        srand(time(NULL));
    
        QuickSort(nums, 0, sizeof(arr)/sizeof(int) - 1);
    
        for(i = 0; i < sizeof(arr)/sizeof(int); i++)
            printf("%d ", arr[i]);
        printf("
    ");
    
        return 0;
    }
      简版:
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    const int N = 100010;
    void quicksort(int num[], int s, int e)
    {
        if (s < e)
        {
            srand(time(NULL));
            int t = s + rand()%(e + 1 - s);
            swap(num[t], num[e]);
            int j = s - 1, x = num[e];
            for (int i = s; i < e; i++)
                if (num[i] < x)
                    swap(num[i], num[++j]);
            swap(num[j + 1], num[e]);
            quicksort(num, s, j);
            quicksort(num, j + 2, e);
        }
    }
    int main()
    {
        int num[N], n;
        cin >> n;
        for (int i = 0; i < n; i++)
            cin >> num[i];
        quicksort(num, 0, n - 1);
        for (int i = 0; i < n; i++)
            cout << num[i] << ' ';
        return 0;
    }
      尾递归版:
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    const int N = 100010;
    void quicksort(int num[], int s, int e)
    {
        while (s < e)
        {
            srand(time(NULL));
            int t = s + rand()%(e + 1 - s);
            swap(num[t], num[e]);
            int j = s - 1, x = num[e];
            for (int i = s; i < e; i++)
                if (num[i] < x)
                    swap(num[i], num[++j]);
            swap(num[j + 1], num[e]);
            quicksort(num, s, j);
            s = j + 1;
        }
    }
    int main()
    {
        int num[N], n;
        cin >> n;
        for (int i = 0; i < n; i++)
            cin >> num[i];
        quicksort(num, 0, n - 1);
        for (int i = 0; i < n; i++)
            cout << num[i] << ' ';
        return 0;
    }
    

      

  • 相关阅读:
    过去式和过去进行式
    现在式和现在进行式
    英文文法的最基本规则
    Vue 标签中的ref属性和refs
    APICloud
    小程序
    React 传值 组件传值 之间的关系
    css clip样式 属性功能及作用
    小程序点击预览 为什么显示空白
    小程序
  • 原文地址:https://www.cnblogs.com/darkchii/p/7735965.html
Copyright © 2020-2023  润新知