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

//排序--快速排序法
#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");
}

原文地址:https://www.cnblogs.com/zhanggaofeng/p/5745642.html