合并排序

来源:互联网 发布:sql语句学生信息 编辑:程序博客网 时间:2024/06/05 02:18

思想:二分法,类似于二叉树的形式,不断的拆分,知道每个部分的个数为1,然后返回到根元素,进行排序。

#include <stdio.h>//合并子序列void merge(int array[], int start, int mid, int end){int len_l = mid - start + 1; // 左子串长度int len_r = end - mid;//右子串长度int len = 0, len_max = 0;//len:两个字串小值,len_max:两子串长度之和int l = start, r = mid + 1;//l:左子串遍历,r:右子串遍历int m = 0;//局部变量数组索引//获取两个子串较小值if(len_l > len_r){len = len_r;}else{len = len_l;}len_max = end - start + 1;int array_t[len_max];for(m = 0; len_r != 0 && len_l != 0; m++){//取两子串的小值保存if(array[l] < array[r]){array_t[m] = array[l];l++;len_l--;}else{array_t[m] = array[r];r++;len_r--;}}//其中一条子串为0,则需要将另一条子串的剩余部分连接到局部数组中if(len_l == 0){while(len_r){array_t[m++] = array[r++];len_r--;}}else if(len_r == 0){while(len_l){array_t[m++] = array[l++];len_l--;}}//将局部数组的值拷贝到原数组for(m = 0; m < len_max; m++){array[start + m] = array_t[m];}}//拆分子序列void split(int array[], int start, int end){int i = 0, j = 0;int mid;if(start == end){return;}else{mid = start + (end - start) / 2;//拆分成两条子串split(array, start, mid);  split(array, mid + 1, end);//按顺序合并merge(array, start, mid, end);}return;}int main(){int array[8] = {3, 41, 52, 26, 38, 57, 9, 49};split(array, 0, 7);int i = 0;for(i = 0; i < 8; i++){printf("%d ", array[i]);}printf("\n");}




0 0
原创粉丝点击