[C语言] 数组 快速排序 (带随机生成测试用例)

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

#define MAX_SIZE		100
#define MOD_NUMBER      100
#define COLUMN_WIDTH    10	//每行打印元素个数

int* getRandArray(int length, int min, int max);
void showdata(int data[], int length);
void quick(int _buff[],int _size);

int main(void)
{
    int* arr;
    int length;

    srand((unsigned)time(NULL));//用当前系统时间设置种子
    length = rand()%MAX_SIZE + 1;
    arr = getRandArray(length,0,MOD_NUMBER);

	printf("\n快速排序:\n");
    quick(arr,length);
    showdata(arr,length);

    free(arr);
}

int* getRandArray(int length, int min, int max)
{
    int* p_arr;
    int i;
    if(max < min){
        max ^= min;
        min ^= max;
        max ^= min;
    }
    p_arr = malloc(sizeof(int)*length);
    printf("随机初始化数组的%d个数(范围是%d~%d):\n",length,min,max);
    max -= min-1;
    for(i=0;i<length;i++){
        p_arr[i] = rand()%max + min;
        if(i!=0 && i%COLUMN_WIDTH==0)
            printf("\n");
        printf("%4d",p_arr[i]);
    }
    printf("\n");
    return p_arr;
}

void showdata(int data[], int length)
{
    int i;
    for(i=0;i<length;i++){
        if(i!=0 && i%COLUMN_WIDTH==0)
            printf("\n");
        printf("%4d",data[i]);
    }
    printf("\n");
}

void quick(int _buff[],int _size)
{
    int i = 1, j = _size-1;
    if(1 >= _size)
        return;
    do{
        while (0<j && _buff[j]>_buff[0])
            j--;
        while (i<j && _buff[i]<=_buff[0])
            i++;
        if(i < j){
            _buff[i] ^= _buff[j];
            _buff[j] ^= _buff[i];
            _buff[i] ^= _buff[j];
            //printf("swap buff[%d] and buff[%d]:\n",i,j);
            //showdata(_buff,_size);
        }
    }while (i < j);
    if (j/*!=0*/){
        _buff[0] ^= _buff[j];
        _buff[j] ^= _buff[0];
        _buff[0] ^= _buff[j];
        //printf("swap buff[%d] and buff[%d]:\n",0,j);
        //showdata(_buff,_size);
    }
    quick(&_buff[0],j);
    quick(&_buff[j+1],_size-j-1);
}

// void quick2(int arr[],int _size)
// {
//     int temp = arr[0];
//     int li = 0, ri = _size-1;
//     if(1 >= _size)
//         return;
//     while (li < ri)
//     {
//         while (li < ri && arr[ri] > temp)
//             ri--;
//         if (li < ri){
//             arr[li] = arr[ri];
//             li++;
//         }
//         while (li < ri && arr[li] < temp)
//             li++;
//         if (li < ri){
//             arr[ri] = arr[li];
//             ri--;
//         }
//     }
//     arr[li] = temp;
//     quick2(&arr[0],li);
//     quick2(&arr[li+1],_size-li-1);
// }


©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页