Algorithm--歸併排序
阿新 • • 發佈:2019-02-06
#include "stdafx.h" #include <iostream> #define DATA_SIZE 14 void merging(int *pList1, int list1_size, int *pList2, int list2_size) { int i = 0; int j = 0; int k = 0; int m = 0; int temp[DATA_SIZE]; while ( i < list1_size && j < list2_size ) { if ( pList1[i] < pList2[j] ) { temp[k++] = pList1[i++]; } else { temp[k++] = pList2[j++]; } } while ( i < list1_size ) { temp[k++] = pList1[i++]; } while ( j < list2_size ) { temp[k++] = pList2[j++]; } for ( m = 0; m < (list1_size + list2_size); m++) { pList1[m] = temp[m]; } } void mergeSort1(int data[], int iDataSize) { if ( iDataSize > 1 ) { int *pList1 = data; int list1_size = iDataSize / 2; int *pList2 = data + iDataSize / 2; int list2_size = iDataSize - list1_size; mergeSort1(pList1, list1_size); mergeSort1(pList2, list2_size); merging(pList1, list1_size, pList2, list2_size); } } void mergeSort2(int data[], int iDataSize) { int i = 0; int iNext = 0; int iLeft_min = 0; int iLeft_max = 0; int iRight_min = 0; int iRight_max = 0; int *pTemp = (int *)malloc(iDataSize * sizeof(int)); for ( i = 1; i < iDataSize; i *= 2 ) { for ( iLeft_min = 0; iLeft_min < iDataSize - i; iLeft_min = iRight_max ) { iRight_min = iLeft_min + i; iLeft_max = iLeft_min + i; iRight_max = iLeft_max + i; if ( iRight_max > iDataSize ) { iRight_max = iDataSize; } iNext = 0; while ( iLeft_min < iLeft_max && iRight_min < iRight_max ) { if ( data[iLeft_min] < data[iRight_min] ) { pTemp[iNext++] = data[iLeft_min++]; } else { pTemp[iNext++] = data[iRight_min++]; } } while ( iLeft_min < iLeft_max ) { data[--iRight_min] = data[--iLeft_max]; } while ( iNext > 0 ) { data[--iRight_min] = pTemp[--iNext]; } } } free(pTemp); } void printResult(int data[], int iDataSize) { printf("排序後的結果是:"); for ( int i = 0; i < iDataSize; i++) { printf("%d ", data[i]); } printf("\n\n"); } //歸併排序--遞迴實現 void mergeSort_recursive() { int data[DATA_SIZE] = {3,6,1,4,2,5,9,33,8,1,22,32,11,18}; mergeSort1(data, DATA_SIZE); printResult(data, DATA_SIZE); }