并归排序

来源:互联网 发布:锐捷网络2016财报 编辑:程序博客网 时间:2024/05/21 11:17
#include <stdio.h>#include <stdlib.h>#define SIZE 10void merge(int array[], int min, int max, int temp[]);//递归void mergesort(int a[], int first, int mid, int last, int temp[]); //合并交换排序void Mergesort(int array[], int n); //创建临时内存空间int main(void){int array[SIZE] = { 43, 6, 3, 26, 2, 7, 2, 9, 5, 7 };Mergesort(array, SIZE);for (int n = 0; n < SIZE; n++)//打印排序完后的临时数组printf("%d,", array[n]);return 0;}void mergesort(int array[], int min, int mid, int max, int temp[]) {int i = 0;int left_begin = min;//25-28行是确定分割为两个小数组的元素范围int left_end = mid;//前面的区间范围int right_begin = mid + 1;int right_end = max;//后面的区间范围while (left_begin <= left_end&&right_begin <= right_end) {//判断比较大小,并赋给临时数组if (array[left_begin] <= array[right_begin])temp[i++] = array[left_begin++];elsetemp[i++] = array[right_begin++];}while (left_begin <= left_end)//把上面还没循环完毕的数组,中剩下的元素直接取出放入temp数组temp[i++] = array[left_begin++];while (right_begin <= right_end)temp[i++] = array[right_begin++];for (int n = 0; n < i; n++)//把排序好临时的值再放回原先数组中array[min+n] = temp[n];}void merge(int array[], int min, int max, int temp[]) {if (min < max){//这里不理解可以用VS2013看,设置断点,然后启动调试->窗口,把局部变量之类的窗口调出来,一看就明白int mid = (min + max) / 2;merge(array, min, mid, temp);merge(array, mid + 1, max, temp);mergesort(array, min, mid, max, temp);}}//创建临时数组void Mergesort(int array[], int n){int *p = (int*)malloc(SIZE*sizeof(int));if (p != NULL){merge(array, 0, SIZE - 1, p);free(p);}elseprintf("sorry,please debug");}
热烈欢迎各种批评、指正、讨论,经常在线
0 0