C语言实现归并排序
2路归并排序算法
1.定义动态数组
typedef struct {
int * data;
} DSqList;
2.初始化动态数组
void InitDSqList ( DSqList & L, int len) {
L. data = ( int * ) malloc ( len * sizeof ( int ) ) ;
}
3.归并操作
void Merge ( int A[ ] , int low, int mid, int high) {
int i, j, k;
for ( int p = low; p <= high; ++ p) {
B. data[ p] = A[ p] ;
}
for ( i = low, j = mid + 1 , k = i; i <= mid && j <= high; ++ k) {
if ( B. data[ i] <= B. data[ j] )
A[ k] = B. data[ i++ ] ;
else
A[ k] = B. data[ j++ ] ;
}
while ( i <= mid)
A[ k++ ] = B. data[ i++ ] ;
while ( j <= high)
A[ k++ ] = B. data[ j++ ] ;
}
4.归并排序算法实现
void MergeSort ( int A[ ] , int low, int high) {
if ( low < high) {
int mid = ( low + high) / 2 ;
MergeSort ( A, low, mid) ;
MergeSort ( A, mid + 1 , high) ;
Merge ( A, low, mid, high) ;
}
}
项目完整代码
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int * data;
} DSqList;
DSqList B;
void InitDSqList ( DSqList & L, int len) {
L. data = ( int * ) malloc ( len * sizeof ( int ) ) ;
}
void Merge ( int A[ ] , int low, int mid, int high) {
int i, j, k;
for ( int p = low; p <= high; ++ p) {
B. data[ p] = A[ p] ;
}
for ( i = low, j = mid + 1 , k = i; i <= mid && j <= high; ++ k) {
if ( B. data[ i] <= B. data[ j] )
A[ k] = B. data[ i++ ] ;
else
A[ k] = B. data[ j++ ] ;
}
while ( i <= mid)
A[ k++ ] = B. data[ i++ ] ;
while ( j <= high)
A[ k++ ] = B. data[ j++ ] ;
}
void MergeSort ( int A[ ] , int low, int high) {
if ( low < high) {
int mid = ( low + high) / 2 ;
MergeSort ( A, low, mid) ;
MergeSort ( A, mid + 1 , high) ;
Merge ( A, low, mid, high) ;
}
}
int main ( ) {
int A[ ] = { 49 , 38 , 65 , 97 , 76 , 13 , 27 } ;
int len = sizeof ( A) / sizeof ( int ) ;
InitDSqList ( B, len) ;
MergeSort ( A, 0 , len - 1 ) ;
printf ( "归并排序后的结果为:" ) ;
for ( int i = 0 ; i < len; ++ i) {
printf ( "%d " , A[ i] ) ;
}
return 0 ;
}
运行效果图
int A[ ] = { 49 , 38 , 65 , 97 , 76 , 13 , 27 } ;