直接插入排序、希尔排序、冒泡排序、快速排序

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define BUFFSIZE 10
#define DATAMAX 100

typedef struct
{
    int *addr;
    unsigned int length;

} Array,*pArray;

int getRandDate(Array* data,int base)
{
    unsigned int i = NULL;

    srand((unsigned)time(NULL));

    for(i = 0; i < data->length; i++)
        data->addr[i] = rand() % base;

    return 0;
}

void prinArray(pArray p)
{
    unsigned int i;

    for(i = 0; i < p->length; i++)
        printf("%d ",p->addr[i]);

    printf("\n");

    return;
}

/**
插入排序,非递减
**/
int chaRuSort(pArray data,int add)
{
    unsigned int i;
    int j;

    for(i = add; i < data->length; i++)
    {
        int temp = data->addr[i];

        if(data->addr[i] < data->addr[i-add])
        {

            for(j = i - add;j >= 0 && temp < data->addr[j]; j -= add)
                data->addr[j + add] = data->addr[j];

            data->addr[j + add] = temp;
        }
    }
    return 0;
}

/**
希尔排序,非递减
**/
int xiErSort(pArray data,int index[])
{
    int i;
    for(i = 0; i < 3; i++)
        chaRuSort(data,index[i]);

    return 0;
}

/**
冒泡排序,非递减
**/
void swap(int *a,int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;

    return;
}
int maoPaoSort(pArray data)
{
    unsigned int i;
    unsigned int j;
    for(i = 1; i < data->length; i++)
        for(j = 0; j < data->length - 1; j++)
            if(data->addr[j] > data->addr[j + 1])
                swap(&data->addr[j],&data->addr[j + 1]);

    return 0;
}

/**
快速排序,非递减
**/
int Qsort(pArray data,int low,int hight)
{
    int temp = data->addr[low];

    while(low < hight)
    {
        while(low < hight && data->addr[hight] >= temp)
            hight--;

        data->addr[low] = data->addr[hight];

        while(low < hight && data->addr[low] <= temp)
            low++;

        data->addr[hight] = data->addr[low];
    }

    data->addr[low] = temp;

    return hight;
}
void quitSort(pArray data,int low,int hight)
{
    if(low >= hight) //出口
        return;

    int temp = Qsort(data,low,hight);

    quitSort(data,low,temp - 1);

    quitSort(data,temp + 1,hight);
}


int main(int argc,char *argv[])
{
    pArray date = NULL;
    date = (pArray)malloc(sizeof(Array));
    date->length = BUFFSIZE;
    date->addr = (int*)malloc(sizeof(int) * BUFFSIZE);

    /**
    直接插入排序,时间复杂度O(n^2),稳定。
    维护一个[0...i]的有序序列的,把有序序列向后移动,
    把第i+1个记录插入到[0...i]的合适位置,从而得到一个
    [0...i+1]的有序序列。
    **/
    printf("直接插入排序\n");
    getRandDate(date,DATAMAX);
    prinArray(date);
    chaRuSort(date,1);
    prinArray(date);


    /**
    希尔排序是对直接插入排序的改进。
    其基本思想是先把待排记录分割成若干子序列,
    分别进行插入排序,带整体基本有序,在进行
    一次直接插入排序
    **/
    printf("希尔排序\n");
    int index[] = {5,3,1}; //增量
    getRandDate(date,DATAMAX);
    prinArray(date);
    xiErSort(date,index);
    prinArray(date);

    /**
    简单选择排序,起泡排序。时间复杂度O(n^2),稳定
    若第一个比第二个大则逆序,若第二个比第三个大则逆序,
    以此类推使其整体有序。
    **/
    printf("冒泡排序\n");
    getRandDate(date,DATAMAX);
    prinArray(date);
    maoPaoSort(date);
    prinArray(date);

    /**
    快速排序,时间复杂度O(nlog(n))
    其基本思想是通过一趟排序,把序列分为独立的两部分。
    其中一部分均比另一部分小。
    **/
    printf("快速排序\n");
    getRandDate(date,DATAMAX);
    prinArray(date);
    quitSort(date,0,BUFFSIZE - 1);
    prinArray(date);

    /**
    释放内存
    **/
    free(date->addr);
    free(date);

    return 0;
}

好的,我可以给你一个使用 C++ 实现的测试代码,包括直接插入排序希尔排序冒泡排序快速排序、直接选择排序和堆排序,代码如下: ```cpp #include <iostream> #include <ctime> #include <cstdlib> using namespace std; // 直接插入排序 void insertSort(int arr[], int len) { for (int i = 1; i < len; i++) { int temp = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > temp) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = temp; } } // 希尔排序 void shellSort(int arr[], int len) { int gap = len / 2; while (gap > 0) { for (int i = gap; i < len; i++) { int temp = arr[i]; int j = i - gap; while (j >= 0 && arr[j] > temp) { arr[j + gap] = arr[j]; j -= gap; } arr[j + gap] = temp; } gap /= 2; } } // 冒泡排序 void bubbleSort(int arr[], int len) { for (int i = 0; i < len - 1; i++) { for (int j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } // 快速排序 int partition(int arr[], int left, int right) { int pivot = arr[left]; while (left < right) { while (left < right && arr[right] >= pivot) right--; arr[left] = arr[right]; while (left < right && arr[left] <= pivot) left++; arr[right] = arr[left]; } arr[left] = pivot; return left; } void quickSort(int arr[], int left, int right) { if (left < right) { int mid = partition(arr, left, right); quickSort(arr, left, mid - 1); quickSort(arr, mid + 1, right); } } // 直接选择排序 void selectSort(int arr[], int len) { for (int i = 0; i < len - 1; i++) { int minIndex = i; for (int j = i + 1; j < len; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } int temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } } // 堆排序 void maxHeapify(int arr[], int start, int end) { int dad = start; int son = dad * 2 + 1; while (son <= end) { if (son + 1 <= end && arr[son] < arr[son + 1]) { son++; } if (arr[dad] > arr[son]) { return; } else { int temp = arr[dad]; arr[dad] = arr[son]; arr[son] = temp; dad = son; son = dad * 2 + 1; } } } void heapSort(int arr[], int len) { for (int i = len / 2 - 1; i >= 0; i--) { maxHeapify(arr, i, len - 1); } for (int i = len - 1; i > 0; i--) { int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; maxHeapify(arr, 0, i - 1); } } int main() { srand(time(0)); // 用当前时间作为随机数种子 const int N = 10000; int arr[N]; for (int i = 0; i < N; i++) { arr[i] = rand(); // 生成随机数 } clock_t start, end; double duration; start = clock(); insertSort(arr, N); end = clock(); duration = (double)(end - start) / CLOCKS_PER_SEC; cout << "直接插入排序用时:" << duration << "秒" << endl; start = clock(); shellSort(arr, N); end = clock(); duration = (double)(end - start) / CLOCKS_PER_SEC; cout << "希尔排序用时:" << duration << "秒" << endl; start = clock(); bubbleSort(arr, N); end = clock(); duration = (double)(end - start) / CLOCKS_PER_SEC; cout << "冒泡排序用时:" << duration << "秒" << endl; start = clock(); quickSort(arr, 0, N - 1); end = clock(); duration = (double)(end - start) / CLOCKS_PER_SEC; cout << "快速排序用时:" << duration << "秒" << endl; start = clock(); selectSort(arr, N); end = clock(); duration = (double)(end - start) / CLOCKS_PER_SEC; cout << "直接选择排序用时:" << duration << "秒" << endl; start = clock(); heapSort(arr, N); end = clock(); duration = (double)(end - start) / CLOCKS_PER_SEC; cout << "堆排序用时:" << duration << "秒" << endl; return 0; } ``` 这个代码会生成一个长度为 10000 的随机数数组,并分别对其进行直接插入排序希尔排序冒泡排序快速排序、直接选择排序和堆排序,并输出每个排序算法所用的时间。你可以根据需要修改数据规模和排序算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值