• 数据结构 排序(快速排序)


    //排序--快速排序法
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<time.h>
    
    /*
    快速排序
    它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,
    其中一部分的所有数据都比另外一部分的所有数据都要小
    ,然后再按此方法对这两部分数据分别进行快速排序,
    整个排序过程可以递归进行,
    以此达到整个数据变成有序序列。
    
    
    快速排序:
    第一步:在数据集之中,选择一个元素作为"基准"(pivot)
    第二步:所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边
    第三步:对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止
    
    
    */
    
    //位置调换
    void MySwap(int *arr,int a,int b){
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }
    
    //一轮快速排序 single
    int SingleSort(int *arr, int low, int high){
        //获取枢轴
        int pv = arr[low];
        while (low < high){
            //high向左移动
            while (low<high&&arr[high] >= pv){
                high--;
            }
            //此时 high下标的元素的值不大于枢轴  可以调换位置
            MySwap(arr, low, high);
            //注意 此时枢轴的位置在high上   high的值就是Pv
            //low向右移动
            while (low<high&&arr[low]< pv){
                low++;
            }
            //此时 low下标的元素的值大于枢轴  可以调换位置
            MySwap(arr, low, high);
            //注意 此时枢轴的位置在low上   low的值就是Pv
        }
        //返回最终pv所在的位置  此时必定 low==high
        return low;
    }
    
    //快速排序
    void QuickSort(int *arr, int low, int high){
        if (low >= high)
        {
            return;
        }
        //排序一轮
        int pivot = SingleSort(arr, low, high);
        //排序产生的左数组
        QuickSort(arr, low, pivot - 1);
        //排序产生的右数组
        QuickSort(arr, pivot + 1, high);
    }
    
    //打印数组
    void Print(int * arr, int num){
        if (arr == NULL)
        {
            printf("传入参数不可以为空!
    ");
            return;
        }
        int i = 0;
        for (int i = 0; i < num; i++)
        {
            printf("%5d", *(arr + i));
        }
        printf("
    ");
    }
    
    void Test(){
        int i = 0;
        int arr[10] = { 0 };
        //定义时间类型变量
        time_t ts;
        //生成随机数种子
        srand((unsigned int)time(&ts));
        for (i = 0; i < 10; i++)
        {
            arr[i] = (int)(rand() % 100);
        }
        //打印数组
        printf("
    原始数据----
    ");
        Print(arr, 10);
        //快速排序
        printf("快速排序之后的数据
    ");
        QuickSort(arr, 0,9);
        Print(arr, 10);
    }
    
    void main(){
        Test();
        system("pause");
    }

  • 相关阅读:
    出差兰州
    出差乌鲁木齐(3)
    依赖倒置原则
    .NET 打印界面
    出差乌鲁木齐2
    出差乌鲁木齐(2)
    出差乌鲁木齐3
    IStyleGallery.AddItem、UpdateItem、RemoveItem用法
    Shapefile记录检索
    c#利用最小二乘法拟合任意次函数曲线(转)
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5745642.html
Copyright © 2020-2023  润新知