基于median 3的快速排序

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define RANDOM_RANGE 10000

void generateRandom(int **arr, int size)
{
    if (*arr == NULL)
        *arr = (int *)malloc(sizeof(int) * size);
    int *ptr = *arr;
    for (int i = 0; i < size; i++)
    {
        ptr[i] = rand() % RANDOM_RANGE;
    }
}

void displayArr(int *arr, int size)
{
    if (arr != NULL)
    {
        for (int i = 0; i < size; i++)
        {
            printf("%d ", arr[i]);
        }
        printf("\n");
    }
}

void QuickSort(int *A, int left, int right){
    // i,j temp variables, temp, temp1 use for swap
    int tmp1, tmp2, tmp3, temp, center;
    int i, j, temp1, pivot;
    
    if(left >= right) {
        return;
    }
    
    // median 3 begin
    // at last tmp1>tmp2>tmp3
    center = (right+left)/2;
    tmp1 = A[left];
    tmp2 = A[center];
    tmp3 = A[right];

    if (tmp1 < tmp2){
        temp = tmp2;
        tmp2 = tmp1;
        tmp1 = temp;
    }
    if (tmp1 < tmp3) {
        temp = tmp3;
        tmp3 = tmp1;
        tmp1 = temp;
    }
    if (tmp2 < tmp3) {
        temp = tmp3;
        tmp3 = tmp2;
        tmp2 = temp;
    }    
    A[left] = tmp3;
    A[right] = tmp1;
    
    //处理边界条件 
    if ((right-left) == 1){
        if (A[left]>A[right]) {
            temp = A[right];
            A[right] = A[left];
            A[left] = temp;
        }
        return;
    } else {
        if (right == left) return;
    }   
    
    A[center] = A[right-1];
    A[right-1] = tmp2;
    
    
    i = left+1;
    j = right-2;
    pivot = tmp2;

    while(1) {
        
        while(A[i] < pivot) {
            i++;
        }
        
        while(A[j] > pivot) {
            j--;
        }

        if(i < j) {
            temp1 = A[j];
            A[j] = A[i];
            A[i] = temp1;
            i++;
            j--; 
        } else break;
    }

    temp1 = A[i];
    A[i] = A[right-1];
    A[right-1] = temp1;
    pivot = temp1;
    
    //sort left part
    QuickSort(A,left,i-1);
    // sort right part
    QuickSort(A,i+1,right);
}


int main(int argc, char const *argv[])
{
    srand(0);
    
    clock_t start, stop;
    double duration;
    
    //use small size array to test 
    int size = 10;
    int *A1 = NULL;
    generateRandom(&A1, size);
    printf("Values before QuickSort:\n");
    displayArr(A1, size);
    QuickSort(A1, 0, size-1);
    printf("Values after QuickSort:\n");
    displayArr(A1, size);
    free(A1);
    A1 = NULL;

    //test large array time used
    size = 50000;
    generateRandom(&A1, size);
    printf("Values before QuickSort:\n");
    displayArr(A1, 20);
    start = clock();
    QuickSort(A1, 0, size - 1);
    stop = clock();
    // running time in ms
    duration = ((double)(stop - start)) / CLK_TCK*1000.0;
    printf("Values after QuickSort:\n");
    displayArr(A1, 20);
    printf("\nTime used:%f ms",duration);

    return 0;
}
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
快速排序是一种常用的排序算法,而median3快速排序快速排序的一种优化方式。它的基本思想是在选择枢轴元素时,不再简单地选择第一个或最后一个元素,而是选择三个元素中的中位数作为枢轴元素。这样可以避免最坏情况的发生,提高快速排序的效率。下面是median3快速排序的实现代码: ```c++ int Median3(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]); } swap(A[center], A[right - 1]); return A[right - 1]; } void InsertionSort(int *A, int left, int right) { for (int i = left + 1; i <= right; i++) { int tmp = A[i]; int j = i; while (j > left && A[j - 1] > tmp) { A[j] = A[j - 1]; j--; } A[j] = tmp; } } void QuickSort(int *A, int left, int right) { if (left + 5 <= right) { int pivot = Median3(A, left, right); int i = left, j = right - 1; while (true) { while (A[++i] < pivot) {} while (A[--j] > pivot) {} if (i < j) { swap(A[i], A[j]); } else { break; } } swap(A[i], A[right - 1]); QuickSort(A, left, i - 1); QuickSort(A, i + 1, right); } else { InsertionSort(A, left, right); } } ``` 其中,Median3函数用于选择枢轴元素,InsertionSort函数用于在元素个数较少时使用插入排序,QuickSort函数是快速排序的主体部分。在实际使用中,可以根据具体情况进行调整,比如修改cutoff值,选择其他的插入排序算法等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值