探索数据库的实现原理
本篇内容介绍了“探索数据库的实现原理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
归并连接的思想与归并排序的思想类似,详见代码注释.
#include<stdio.h>#include<stdlib.h>#include<string.h>#include"merge_sort.h"/*array:待处理的数组low:低位middle:中间位high:高位*/voidmerge_array(intarray[],intlow,intmiddle,inthigh){//左边数组的大小(middle在左边数组中,加1)intn1=middle-low+1;//右边数组的大小intn2=high-middle;//printf("----merge_array:low=%d,high=%d,middle=%d.\n",low,high,middle);//初始化左右两边数组intleft[n1],right[n2];for(inti=0;i<n1;i++)left[i]=array[low+i];for(inti=0;i<n2;i++)right[i]=array[middle+i+1];//归并inti=0,j=0,k=low;//同时遍历左右两边数组,较小值进入到结果数组中(回填)for(;i<n1&&j<n2;)if(left[i]<right[j])array[k++]=left[i++];elsearray[k++]=right[j++];//处理数组中剩余的其他元素while(i<n1)array[k++]=left[i++];while(j<n2)array[k++]=right[j++];//printf("---merge_array:---\n");//print_array(array+low,n1+n2);}/*array:待处理的数组low:低位high:高位*/voidmerge_arraybyrange(intarray[],intlow,inthigh){if(low>=high)return;//低位置大于等于高位值,退出//取中间位置intmiddle=(low+high)/2;//printf("----merge_sort:low=%d,high=%d,middle=%d.\n",low,high,middle);//对左边数组进行排序merge_arraybyrange(array,low,middle);//对右边数组进行排序merge_arraybyrange(array,middle+1,high);//两边数组排序完毕后,归并两边的数组merge_array(array,low,middle,high);//printf("---merge_sort:----\n");//print_array(array+low,high-low+1);}/*递归调用方法array:待处理的数组low:低位high:高位*/voidmerge_sort_recursion(array*tmparr){intlow=0;inthigh=tmparr->counter-1;merge_arraybyrange(tmparr->arr,low,high);}/*非递归调用方法a/b:已完成排序的数组c:结果数组*/voidmerge_twoarrays2one(array*a,array*b,array*c){inti=0,j=0;c->counter=-1;for(;i<a->counter&&j<b->counter;){//归并排序,任意一个数组结束则循环结束if(a->arr[i]<b->arr[j]){c->arr[++c->counter]=a->arr[i++];}else{c->arr[++c->counter]=b->arr[j++];}}//处理余下的数据while(i<a->counter){c->arr[++c->counter]=a->arr[i++];}while(j<b->counter){c->arr[++c->counter]=b->arr[j++];}//从0开始计数,counter+1c->counter++;}/*tmparr:待排序的array结构体*/voidmerge_sort(array*tmparr){//临时数组inttmp[tmparr->counter];//临时数组(缓存)arraybuffer;buffer.arr=tmp;for(inti=1;i<tmparr->counter;i=i*2){//i=每次比较的数量=2^x=1/2/4/8...for(intj=0;j<tmparr->counter;j+=i*2){//j=比较起始位置,每次比较i个数if(j+i>=tmparr->counter)break;arrayarr1,arr2;//指向比较的位置(数组1)arr1.arr=tmparr->arr+j;arr1.counter=i;//指向比较的位置(数组2)arr2.arr=tmparr->arr+j+i;arr2.counter=i;//数组2的数量,判断以免越界if(j+i*2>=tmparr->counter)arr2.counter=tmparr->counter-(j+i);//归并数组1&2merge_twoarrays2one(&arr1,&arr2,&buffer);//printf("----------i=%d,j=%d,counter=%d\n",i,j,buffer.counter);//print_array(buffer.arr,buffer.counter);//归并好的数据拷贝到tmparr中memcpy(tmparr->arr+j,buffer.arr,buffer.counter*sizeof(int));}//printf("------------i=%d\n",i);//print_array(tmparr->arr,tmparr->counter);}}
运行输出
ethanhe@DESKTOP-V73MH70/d/yunpan/work/Z-SRC/sort$/d/tmp/test.exe---------test_merge-----------item[0]is1item[1]is5item[2]is10item[3]is21item[4]is30item[5]is40item[6]is99item[7]is100item[8]is200item[9]is301item[10]is400---------test_mergebyrecursion-----------item[0]is1item[1]is5item[2]is10item[3]is21item[4]is30item[5]is40item[6]is99item[7]is100item[8]is200item[9]is301item[10]is400
“探索数据库的实现原理”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。