看了几天的递归,总结下经验,看这篇文章前,如果你没有学习过递归这种思想,请看下这个网站,讲的挺不错
http://www.tudou.com/listplay/SaZl9xKGqDE/hFFCJz8mBDM.html
之后你可以理解下写的这个递归排序小应用。
<textarea readonly="readonly" name="code" class="c">
#include<stdio.h>
#include<stdlib.h>//merge函数就是在小程序里(!注意一定要明确是递归的小程序,而不是全部)
//不断合并
void merge(int sourceArr[],int tempArr[],int startIndex,int midIndex,int endIndex)
{
int i,j,k;
i=startIndex;j=midIndex+1;k=startIndex;
while(i!=midIndex+1 && j!=endIndex+1)
{
if(sourceArr[i]<sourceArr[j])
tempArr[k++]=sourceArr[i++];
else
tempArr[k++]=sourceArr[j++];}
while(i!=midIndex+1)
tempArr[k++]=sourceArr[i++];
while(j!=endIndex+1)
tempArr[k++]=sourceArr[j++];
for(i=startIndex;i<=endIndex;i++)
sourceArr[i]=tempArr[i];
}
//mergesort函数就是一个递归并且合并的函数引用
void mergesort(int sourceArr[],int tempArr[],int startIndex,int endIndex)
{
int midIndex;
if(startIndex<endIndex)
{
midIndex=(startIndex+endIndex)/2;
mergesort(sourceArr,tempArr,startIndex,midIndex);
mergesort(sourceArr,tempArr,midIndex+1,endIndex);
merge(sourceArr,tempArr,startIndex,midIndex,endIndex);
}
}
int main()
{
int a[8]={50,20,20,30,70,40,80,60};
int b[10],i;
mergesort(a,b,0,7);
for(i=0;i<=7;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
</textarea>
更新代码:
#include <iostream>
#include <stdio.h>
using namespace std;
void merge(int arr[],int L,int M,int R)
{
int left_size=M-L+1;
int right_size=R-M;
int left[left_size],right[right_size];
int i,j,k;
//fill into left array and right array
for(i=L;i<=M;i++)
left[i-L]=arr[i];
for(i=M;i<=R;i++)
right[i-M]=arr[i+1];
//pick up two arrays which is smaller
i=0;j=0;k=L;
while(i<left_size && j<right_size)
{
if(left[i]<right[j])
{
arr[k]=left[i];
k++;i++;
}
else
{
arr[k]=right[j];
k++;j++;
}
}
while(i<left_size)
{
arr[k]=left[i];
k++;i++;
}
while (j<right_size)
{
arr[k]=right[j];
k++;j++;
}
}
void mergeSort(int arr[],int L,int R)
{
if(L==R)
return ;
else
{
int M=(L+R)/2;
mergeSort(arr,L,M);
mergeSort(arr,M+1,R);
merge(arr,L,M,R);
}
}
int main()
{
int arr[]={2,4,6,9,8,1,3,5,7};
int L=0;
int R=7;
int M=3;
int i;
mergeSort(arr,L,R);
for(i=0;i<=R;i++)
printf("%d ",arr[i]);
return 0;
}