OJ6-1 A. quick sort

A. quick sort

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#define cutoff 3
void insertSort(int a[], int left, int right);
void Qsort(int a[], int left, int right);
int mid3(int a[], int left, int right);

void swap(int *a, int *b);
int main()
{
    int index;
    scanf("%d", &index);
    int a[10] = {49, 38, 65, 97, 76, 13, 27, 50, 2, 8};

    int i, j;
    int temp;
    int pivot;
    pivot = a[index];
    temp = a[index];
    a[index] = a[9];
    a[9] = temp;

    i = -1;
    j = 9;

    for (;;)
    {
        while (a[++i] < pivot)
        {
        }
        while (a[--j] > pivot)
        {
        }
        if (i < j)
        {
            temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        }
        else
        {
            break;
        }
    }
    temp = a[i];
    a[i] = a[9];
    a[9] = temp;

    printf("Qsort(0,9):");
    for (int k = 0; k < 10; k++)
    {
        printf("%d,", a[k]);
    }
    printf("\n");

    Qsort(a, 0, i - 1);
    Qsort(a, i + 1, 9);

    return 0;
}

int mid3(int a[], int left, int right)
{
    int center = (left + right) / 2;
    int temp;
    if (a[left] > a[right])
    {
        temp = a[left];
        a[left] = a[right];
        a[right] = temp;
    }
    if (a[left] > a[center])
    {
        temp = a[left];
        a[left] = a[center];
        a[center] = temp;
    }
    if (a[center] > a[right])
    {
        temp = a[center];
        a[center] = a[right];
        a[right] = temp;
    }
    temp = a[center];
    a[center] = a[right - 1];
    a[right - 1] = temp;

    return a[right - 1];
}

void Qsort(int a[], int left, int right)
{
    int pivot;
    int i, j;
    int temp;
    if (left + cutoff <= right)
    {
        pivot = mid3(a, left, right);
        i = left;
        j = right - 1;
        for (;;)
        {
            while (a[++i] < pivot)
            {
            }
            while (a[--j] > pivot)
            {
            }
            if (i < j)
            {
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
            else
            {
                break;
            }
        }
        temp = a[i];
        a[i] = a[right - 1];
        a[right - 1] = temp;

        printf("Qsort(%d,%d):", left, right);
        for (int k = 0; k < 10; k++)
        {
            printf("%d,", a[k]);
        }
        printf("\n");

        Qsort(a, left, i - 1);
        Qsort(a, i + 1, right);
    }
    else
    {
        insertSort(a, left, right);
    }
}

void insertSort(int a[], int left, int right)
{
    int temp;
    int i, j;
    for (i = left; i <= right; i++)
    {
        temp = a[i];
        for (j = i; j >= 1 && temp < a[j - 1]; j--)
        {
            a[j] = a[j - 1];
        }
        a[j] = temp;
    }

    printf("insert(%d,%d):", left, right - left + 1);
    for (int k = 0; k < 10; k++)
    {
        printf("%d,", a[k]);
    }
    printf("\n");
}

void swap(int *a, int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

在这里插入图片描述
第二版:

#include <stdio.h>
void swap(int *a, int *b);
int med3(int a[], int left, int right);
void Qsort(int a[], int left, int right);
void insertSort(int a[], int left, int right);
int main()
{
    int a[10] = {49, 38, 65, 97, 76, 13, 27, 50, 2, 8};

    int index;
    scanf("%d", &index);
    int pivot = a[index];
    swap(&a[index], &a[9]);
    int i, j;
    /
    i = -1; //第一次检查 要从第一个元素 下标为0的开始!!!!!
    j = 9;
    for (;;)
    {
        while (a[++i] < pivot) //别写反了
        {
        };
        while (a[--j] > pivot)
        {
        };
        if (i < j)
        {
            swap(&a[i], &a[j]);
        }
        else
        {
            break;
        }
    }

    //retore the pivot
    swap(&a[i], &a[9]);

    printf("Qsort(0,9):");
    for (int i = 0; i < 10; i++)
    {
        printf("%d,", a[i]);
    }
    printf("\n");

    /

    Qsort(a, 0, i - 1);
    Qsort(a, i + 1, 9);
}
void swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

void Qsort(int a[], int left, int right)
{
    //要理解Qsort函数的整体结构:总体上分为两大部分 元素数量较多的快速排序和
    // 元素较少是cutoff时的 插入排序,第一个if中包括的内容很多
    int pivot;
    int i, j;

    if (left + 3 <= right)
    {
        i = left;
        j = right - 1;
        pivot = med3(a, left, right);// 一定在第一个if的里面!!!!!!!!!
        for (;;)
        {
            while (a[++i] < pivot) //别写反了
            {
            };
            while (a[--j] > pivot)
            {
            };
            if (i < j)
            {
                swap(&a[i], &a[j]);
            }
            else
            {
                break;
            }
        }

        //retore the pivot
        swap(&a[i], &a[right - 1]);

        printf("Qsort(%d,%d):", left, right);
        for (int i = 0; i < 10; i++)
        {
            printf("%d,", a[i]);
        }
        printf("\n");

        Qsort(a, left, i - 1);
        Qsort(a, i + 1, right);
    }

    else
    {
        insertSort(a, left, right);
    }
}

int med3(int a[], int left, int right)
{
    int center = (left + right) / 2;
    if (a[left] > a[center])
    {
        swap(&a[left], &a[center]);
    }
    if (a[left] > a[right])
    {
        swap(&a[left], &a[right]);
    }
    if (a[center] > a[right])
    {
        swap(&a[center], &a[right]);
    }

    //hide the pivot
    swap(&a[center], &a[right - 1]);
    return a[right - 1];
}

void insertSort(int a[], int left, int right)
{
    int i, j;
    int temp;
    for (i = left; i <= right; i++)
    {
        temp = a[i];
        for (j = i; j >= 1 && temp < a[j - 1]; j--) //一定是j>=1
        {
            a[j] = a[j - 1];
        }
        a[j] = temp; //这里一定是j 上次机考就在这里翻车了!!
    }

    printf("insert(%d,%d):", left, right - left + 1);
    for (int k = 0; k < 10; k++)
    {
        printf("%d,", a[k]);
    }
    printf("\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值