資料庫實現原理#3(Merge Join).md
歸併連線的思想與歸併排序的思想類似,詳見程式碼註釋.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "merge_sort.h"
/*
array : 待處理的陣列
low : 低位
middle : 中間位
high : 高位
*/
void merge_array(int array[],int low,int middle,int high)
{
//左邊陣列的大小(middle在左邊陣列中,加1)
int n1 = middle - low + 1;
//右邊陣列的大小
int n2 = high - middle;
//printf("---- merge_array : low = %d,high = %d,middle = %d.\n",low,high,middle);
//初始化左右兩邊陣列
int left[n1],right[n2];
for(int i = 0;i < n1;i++)
left[i] = array[low+i];
for(int i = 0;i < n2;i++)
right[i] = array[middle+i+1];
//歸併
int i=0,j=0,k=low;
//同時遍歷左右兩邊陣列,較小值進入到結果陣列中(回填)
for(;i < n1 && j < n2;)
if(left[i] < right[j])
array[k++] = left[i++];
else
array[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 : 高位
*/
void merge_arraybyrange(int array[],int low,int high)
{
if (low >= high)
return;//低位置大於等於高位值,退出
//取中間位置
int middle = (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 : 高位
*/
void merge_sort_recursion(array *tmparr)
{
int low = 0;
int high = tmparr->counter - 1;
merge_arraybyrange(tmparr->arr,low,high);
}
/*
非遞迴呼叫方法
a/b:已完成排序的陣列
c:結果陣列
*/
void merge_twoarrays2one(array *a,array *b,array *c)
{
int i=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+1
c->counter++;
}
/*
tmparr : 待排序的array結構體
*/
void merge_sort(array *tmparr)
{
//臨時陣列
int tmp[tmparr->counter];
//臨時陣列(快取)
array buffer;
buffer.arr = tmp;
for(int i=1;i < tmparr->counter;i=i*2)
{
//i=每次比較的數量=2^x = 1/2/4/8...
for(int j=0;j < tmparr->counter;j+=i*2)
{
//j=比較起始位置,每次比較i個數
if(j+i >= tmparr->counter)
break;
array arr1,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&2
merge_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] is 1
item[1] is 5
item[2] is 10
item[3] is 21
item[4] is 30
item[5] is 40
item[6] is 99
item[7] is 100
item[8] is 200
item[9] is 301
item[10] is 400
--------- test_merge by recursion-----------
item[0] is 1
item[1] is 5
item[2] is 10
item[3] is 21
item[4] is 30
item[5] is 40
item[6] is 99
item[7] is 100
item[8] is 200
item[9] is 301
item[10] is 400
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6906/viewspace-2684530/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料庫實現原理#4(Hash Join)資料庫
- 資料庫實現原理#1(Nested Loop Join)資料庫OOP
- 資料庫實現原理#2(獲取第N個值).md資料庫
- 談談fork/join實現原理
- MySQL Join的底層實現原理MySql
- 資料庫實踐丨MySQL多表join分析資料庫MySql
- 要命的MERGE JOIN CARTESIAN
- Flink SQL 如何實現資料流的 Join?SQL
- 資料庫實現原理#6(共享記憶體)資料庫記憶體
- 資料庫連線池的實現及原理資料庫
- 資料庫分散式事務的實現原理!資料庫分散式
- PostgreSQL/GreenPlum Merge Inner Join解密SQL解密
- 分散式資料庫下子查詢和 Join 等複雜 SQL 如何實現?分散式資料庫SQL
- 大資料開發-Spark Join原理詳解大資料Spark
- MySQL資料庫分散式事務XA的實現原理分析MySql資料庫分散式
- 資料庫實現原理#5(FSM:最大堆二叉樹)資料庫二叉樹
- 資料庫原理資料庫
- TiDB資料庫left join與版本問題TiDB資料庫
- 資料庫級別的 MD5 加密資料庫加密
- 多表連線的三種方式詳解 hash join、merge join、 nested loopOOP
- 資料庫索引原理資料庫索引
- InlineHook & 原理與實現(3)inlineHook
- [資料庫][SQL]圖解各種連線join資料庫SQL圖解
- 帶你瞭解資料庫中JOIN的用法資料庫
- 分散式鎖的3種實現(資料庫、快取、Zookeeper)分散式資料庫快取
- 雙向資料繫結實現原理
- 【資料結構】ArrayList原理及實現資料結構
- 分散式資料庫中介軟體的實現原理介紹一:分庫分表分散式資料庫
- MySQL基礎入門學習教程:mysql資料庫的實現原理MySql資料庫
- 資料庫連線池實現資料庫
- Redis多機資料庫實現Redis資料庫
- 複習資料庫原理資料庫
- 一文讀懂圖資料庫 Nebula Graph 訪問控制實現原理資料庫
- CAS配置資料庫,實現資料庫使用者認證資料庫
- 10.註冊和登入功能實現(3)—— 註冊資料寫入資料庫資料庫
- 重新學習Mysql資料庫3:Mysql儲存引擎與資料儲存原理MySql資料庫儲存引擎
- OceanBase 原始碼解讀(七):一文讀懂資料庫索引實現原理原始碼資料庫索引
- django使用多個資料庫實現Django資料庫