快速排序算法(C语言)

快排:

首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。


时间复杂度:O(n^2)
空间复杂度:O(log n)
是否稳定:不稳定
适用场合:数据较多且杂乱


这里写图片描述


这里写图片描述


前后指针法:


#include <stdio.h>
#include <windows.h>
#pragma warning (disable:4996)

void Swap(int* x, int* y)
{
    int tmp = *x;
    *x = *y;
    *y = tmp;
}

int Find_mid(int* arr, int left, int right)//三数取中法
{
    int mid = left + ((right - left) >> 1);
    if (arr[left] < arr[right])
    {
        if (arr[mid] < arr[left])
            return left;
        else if (arr[mid] > arr[right])
            return right;
        else
            return mid;
    }
    else
    {
        if (arr[mid] > arr[left])
            return left;
        else if (arr[mid] < arr[right])
            return right;
        else
            return mid;
    }
}

int Sort(int* arr, int left, int right) 
{
    int key;
    int begin = left;
    int end = right - 1; 
    int keyIdx = Find_mid(arr, left, right-1);
    if (keyIdx != right - 1)
    {
        Swap(&arr[keyIdx], &arr[right - 1]);
    }
    key = arr[right - 1];
    while (begin < end)
    {
        while (begin < end && arr[begin] <= key)
            begin++;
        while (begin < end && arr[end] >= key)
            end--;

        if (begin < end)//
        {
            Swap(&arr[begin], &arr[end]);
        }
        else//只需将一个指针与参考值交换
        {
            Swap(&arr[begin], &arr[right-1]);
        }
    }
        return begin;
}

void QuickSort(int* arr, int left, int right)//递归
{
    if (left < right)//出口条件
    {
        int mid = Sort(arr, left, right);
        QuickSort(arr, left, mid);
        QuickSort(arr, mid + 1, right);
    }
}

void printf_arr(int *arr,int size) //打印数组
{
    int i = 0;
    for (; i < size; i++)
    {
        printf("%d ", arr[i]);
    }
}


int main()
{
    int arr[10] = {2,7,1,4,3,9,6,0,5,8};
    //int arr[10] = { 4,4,6,7,3,0,9,3,5,2 };
    int size = sizeof(arr) / sizeof(arr[0]);

    QuickSort(arr,0,size);
    printf_arr(arr, size);

    system("pause");
    return 0;
}

挖坑法,hoare法后续更新……

猜你喜欢

转载自blog.csdn.net/romantic_c/article/details/79902858