归并排序算法

来源:互联网 发布:免费自动发卡平台源码 编辑:程序博客网 时间:2024/05/22 07:41

归并排序就是利用归并的思想实现的排序方法。原理如图所示:

 

#include <stdio.h>#include <malloc.h>void println( int a[], int len ){int i = 0;for( i=0; i < len; i++ ){printf("%d ", a[i]);}printf("\n");}void swap( int a[], int i, int j ){int temp = a[i];a[i] = a[j];a[j] = temp;}void Merge(int src[], int des[], int low, int mid, int high){int i = low;int j = mid+1;int k = low;static int count = 0;while( ( i <= mid ) && ( j <= high ) ){//找出[low...mid]和[mid+1...high]两个有序序列的小的元素放入目标序列if( src[i] <= src[j] ){des[k++] = src[i++];}else{des[k++] = src[j++];}}while( i <= mid )  //将剩余的元素复制到目标数组{des[k++] = src[i++];}while( j <= high )  //将剩余的元素复制到目标数组{des[k++] = src[j++];}printf("calling: %d\n", count++);}void MSort(int src[], int des[], int low, int high, int max ){if( low == high ){des[low] = src[low];}else{int mid = (low+high) / 2;   //将序列分成两部分int* space = (int*)malloc(sizeof(int) * max);  //分配辅助空间if( space != NULL ){MSort( src, space, low, mid, max );   //将src[low...mid]归并为有序的space[low...mid]MSort( src, space, mid+1, high, max); //将src[mid+1....high]归并为有序的space[low...mid]Merge( space, des, low, mid, high );  //将space[low...mid]和space[low...mid]归并到des[low...high]}free(space);}}void MergeSort( int a[], int len ){MSort( a, a, 0, len-1, len);}int main(){int array[] = {21, 25, 49, 21, 16, 8};int len = sizeof(array) / sizeof(*array);println(array, len);MergeSort(array, len);println(array, len);return 0;}

    在void Merge(int src[], int des[], int low, int mid, int high)函数的第10行判断语句

             if( src[i] <= src[j] )

             {

                     des[k++] = src[i++];

             }

             else

            {

                  des[k++] = src[j++];

            }

     好多算法介绍上都是if( src[i] < src[j] ),我个人认为这样导致了不稳定性。因为在src[i]==src[j]的时候,选择的是右半部分的src[j]元素,而左半部分的src[i]元素放在了src[j]的后面,这样就不是稳定的了,因此应该改成if( src[i] <= src[j] )

0 0
原创粉丝点击