归并排序(c语言)

来源:互联网 发布:微信预约排号系统源码 编辑:程序博客网 时间:2024/06/05 20:58
#include <stdio.h>#include <time.h>#include <stdlib.h>#define max 10void merge_sort(int a[], int p, int r);void merge(int a[], int p, int q, int r);int main() {    int array[max];    int i;    srand((unsigned)time(NULL));    for (i = 0; i < max; i++) {        array[i] = rand() % 90 + 10;    }    printf("unsorted array: ");    for (i = 0; i < max; i++) {        printf("%d ", array[i]);    }    printf("\n");    merge_sort(array, 0, 9);    for (i = 0; i < max; i++) {        printf("%d ", array[i]);    }    printf("\n");    return 0;}void merge(int a[], int p, int q, int r) {    int i, j, k, n1, n2;    int *front, *back;    n1 = q - p + 1;    n2 = r - q;    front = (int *)malloc(n1 * sizeof(int));    back = (int *)malloc(n2 * sizeof(int));//申请两个动态内存空间    for (i = 0; i < n1; i++) {        front[i] = a[p + i];    }    for (i = 0; i < n2; i++) {        back[i] = a[q + i + 1];    }    i = 0;    j = 0;    k = p;    while (i < n1 && j < n2) {        if (front[i] < back[j]) {            a[k++] = front[i++];        } else {            a[k++] = back[j++];        }    }    while (i < n1) {        a[k++] = front[i++];    }    while (j < n2) {        a[k++] = back[j++];    }}void merge_sort(int a[], int p, int r) {    int q;    if (p < r) {        q = (p + r) / 2;        merge_sort(a, p, q);        merge_sort(a, q + 1, r);        merge(a, p, q, r);    }}

归并模型!

void merge(int a[], int p, int q, int r) {    int i, j, k, n1, n2;    int *front, *back;    n1 = q - p + 1;    n2 = r - q;    front = (int *)malloc(n1 * sizeof(int));    back = (int *)malloc(n2 * sizeof(int));//申请两个动态内存空间    for (i = 0; i < n1; i++) {        front[i] = a[p + i];    }    for (i = 0; i < n2; i++) {        back[i] = a[q + i + 1];    }    i = 0;    j = 0;    k = p;    while (i < n1 && j < n2) {        if (front[i] < back[j]) {            a[k++] = front[i++];        } else {            a[k++] = back[j++];        }    }    while (i < n1) {        a[k++] = front[i++];    }    while (j < n2) {        a[k++] = back[j++];    }}void merge_sort(int a[], int p, int r) {    int q;    if (p < r) {        q = (p + r) / 2;        merge_sort(a, p, q);        merge_sort(a, q + 1, r);        merge(a, p, q, r);    }}

运用分治的思想,时间复杂度始终为o(nlogn)

0 0
原创粉丝点击