Hbase基礎(七):Sqoop 的簡單使用案例
阿新 • • 發佈:2020-07-31
時間複雜度:O(nlongn)二分一次需要logn,需要n次
空間複雜度:O(n)需要陣列同樣大小的臨時空間
將陣列按照二分法,分成兩塊,分別各自排順序
給出如下陣列
將兩部分分別排好序
然後用分別排好序的陣列
首先,將原陣列複製一遍,藍色箭頭表示原陣列,紅色箭頭表示新陣列
將複製的陣列分成兩部分,每一個部分的第一個元素進行比較
選出小的元素放入原陣列,藍色箭頭後移到下一位,選中的紅色箭頭也後移到下一位
每一輪,紅色陣列前半部分和後半部分的元素進行比較,將小的元素填入藍色陣列。之後選擇下一個元素進入下一輪比較,以此類推
定義三個標記位置
i和j表示需要比較的元素,k表示比較後需要放入的位置
知道了歸併的思想,再用遞迴的方法寫歸併函式
//將arr[l,mid]和arr[mid+1,r]兩部分進行歸併 template<typename T> void __merge(T arr[], int l, int mid, int r) {//確定元素放置在原陣列中的位置 T aux[r - l + 1]; for(int i=l;i<=r;i++){ aux[i-l] == arr[i]; } int i = l, j = mid + 1; for (int k = l; k <= r; k++) {if(i>mid){//判斷是否越界 arr[k] = aux[j-l]; j++; } else if (j > r) {//判斷是否越界 arr[k] = aux[i - l]; i++; } else if (aux[i - l] < aux[j - l]) {//如果i-1小,i-1就放入k中 arr[k] = aux[i - l]; i++; }else {//如果j-1小,j-1就放入k中 arr[k] = aux[j - l]; j++; } } } //遞迴使用歸併排序,對arr[l,r]範圍進行排序 template <typename T> void __mergeSort(T arr[], int l, int r) { if (l >= r) {//一個元素都沒有,資料集為空 return; } int mid = (l + r) / 2; __mergeSort(arr, l, mid);//左半部分歸併排序 __mergeSort(arr, mid + 1, r);//右半部分歸併排序 __merge(arr, l, mid, r);//歸併 } template<typename T> void mergeSort(T arr[], int n) { __mergeSort(arr, 0, n - 1);//第n個是空的,n-1有值 }