C语言排序算法汇总

来源:互联网 发布:上海师范大学网络课程 编辑:程序博客网 时间:2024/05/18 17:23

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

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;}

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

原创粉丝点击