C语言排序算法汇总

冒泡排序、插入排序、希尔排序

1、冒泡排序

int BubbleSort(int *data, int length) {
    if (data == NULL) {
        printf("data is NULL\n");
        return -1;
    }
    int tmp = 0;
    for (int i = 0; i < length;i++) {
        for (int j = 0; j < length - i - 1;j++) {
            if (data[j] > data[j + 1]) {
                tmp = data[j];
                data[j] = data[j + 1];
                data[j + 1] = tmp;
            }
        }
    }
    return 0;
}

原理很简单,这里不赘述。

2、插入排序

插入排序:保证前p个数据是有序的,每次向后读一个一个数据到有序序列中进行排序;
例如:5 7 3 6 1 8 9 4 2

  1. 5 7 3 6 1 8 9 4 2
  2. 5 3 7 6 1 8 9 4 2
  3. 3 5 6 7 1 8 9 4 2
  4. 1 3 5 6 7 8 9 4 2
  5. 1 3 5 6 7 8 9 4 2
  6. 1 3 5 6 7 8 9 4 2
  7. 1 3 4 5 6 7 8 9 2
  8. 1 2 3 4 5 6 7 8 9
int InsertSort(int *data, int length) {
    int tmp = 0;
    int i = 0;
    int j = 0;
    for (i = 1;i < length;i++) {
        tmp = data[i];
        for (j = i;j > 0 && data[j - 1] > tmp;j--)
            data[j] = data[j - 1];
        data[j] = tmp;
    }
    return 0;
}

注意代码中的处理方式可以避免显式的数据交换;例如第7步到第8步的过程:先把2存入tmp;然后数据依次向后移动,直到data[j-1]>tmp;

3、希尔排序

希尔排序是按照增量序列进行排序的;
例如:希尔增量序列:ht = N/2;h(k) = h(k+1)/2;向下取整。
假设有16个数据,N=16;
0 8 ,1 9, 2 10, 3 11,4 12, 5 13, 6 14, 7 15,
0 4, 1 5, 2 6, 3 7, 4 8, 5 9, 6 10, 7 11, 8 12,,,,
0 2, 1 3, 2 4, 3 5, 4 6,,,,,
0 1, 1 2, ,,,,
也可以使用其他增量序列。

int ShellSort(int *data, int length) {
    int i = 0;
    int j = 0;
    int step = length;
    int tmp = 0;
    for (step = length/2;step > 0;step /= 2) {
        for (i = step;i < length;i++) {
            tmp = data[i];
            for (j = i;j >= step;j -= step) {
                if (data[j - step] > tmp) {
                    data[j] = data[j - step];
                }
                else
                    break;
            }
            data[j] = tmp;
        }

    }
    return 0;
}

4、整体测试代码

#include<stdio.h>
#include<stdlib.h>
int getData(int *data, int length) {
    if (data == NULL) {
        printf("data is NULL\n");
        return -1;
    }
    for (int i = 0; i < length;i++) {
        data[i] = rand() % 1000;
    }
    return 0;
}

int BubbleSort(int *data, int length) {
    if (data == NULL) {
        printf("data is NULL\n");
        return -1;
    }
    int tmp = 0;
    for (int i = 0; i < length;i++) {
        for (int j = 0; j < length - i - 1;j++) {
            if (data[j] > data[j + 1]) {
                tmp = data[j];
                data[j] = data[j + 1];
                data[j + 1] = tmp;
            }
        }
    }
    return 0;
}
int InsertSort(int *data, int length) {
    int tmp = 0;
    int i = 0;
    int j = 0;
    for (i = 1;i < length;i++) {
        tmp = data[i];
        for (j = i;j > 0 && data[j - 1] > tmp;j--)
            data[j] = data[j - 1];
        data[j] = tmp;
    }
    return 0;
}
int ShellSort(int *data, int length) {
    int i = 0;
    int j = 0;
    int step = length;
    int tmp = 0;
    for (step = length/2;step > 0;step /= 2) {
        for (i = step;i < length;i++) {
            tmp = data[i];
            for (j = i;j >= step;j -= step) {
                if (data[j - step] > tmp) {
                    data[j] = data[j - step];
                }
                else
                    break;
            }
            data[j] = tmp;
        }

    }
    return 0;
}
int checkResult(int *data1, int *data2, int length) {
    for (int i = 0;i < length;i++) {
        if (data1[i] - data2[i] != 0)
            return -1;
    }
    return 0;
}
int main() {

    int length = 1000;
    int error = 0;
    int* data = (int *)malloc(sizeof(int) * length);
    if (data == NULL) {
        printf("malloc failed!\n");
        return -1;
    }
    int* bubbleData = (int *)malloc(sizeof(int) * length);
    if (bubbleData == NULL) {
        printf("malloc failed!\n");
        return -1;
    }
    int* insertData = (int *)malloc(sizeof(int) * length);
    if (insertData == NULL) {
        printf("malloc failed!\n");
        return -1;
    }
    int* shellData = (int *)malloc(sizeof(int) * length);
    if (shellData == NULL) {
        printf("malloc failed!\n");
        return -1;
    }
    error = getData(data, length);
    if (error != 0) {
        printf("get data failed!\n");
        return -1;
    }

    for (int i = 0;i < length;i++) {
        bubbleData[i] = data[i];
        insertData[i] = data[i];
        shellData[i] = data[i];
        //printf("%d %d %d\n", data[i], bubbleData[i], insertData[i]);
    }


    error = BubbleSort(bubbleData, length);
    if (error != 0) {
        printf("BubbleSort failed!\n");
        return -1;
    }
    error = InsertSort(insertData, length);
    if (error != 0) {
        printf("InsertSort failed!\n");
        return -1;
    }
    error = ShellSort(shellData, length);
    if (error != 0) {
        printf("InsertSort failed!\n");
        return -1;
    }
    error = checkResult(shellData, insertData, length);
    if (error != 0) {
        printf("sort failed!\n");
        return -1;
    }
    printf("sort succeed!\n");
    free(data);
    free(bubbleData);
    free(insertData);
    free(shellData);
    return 0;
}

后续会更新堆排序以及归并排序等方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值