排序算法——2

来源:互联网 发布:select算法 编辑:程序博客网 时间:2024/05/17 23:49

排序算法——2

- 归并排序(Merge Sort)

依旧先上源代码

#include <stdlib.h>#include <stdio.h>void Merge(int sourceArr[],int tempArr[], int startIndex, int midIndex, int endIndex){    int i = startIndex, j=midIndex+1, k = startIndex;    while(i!=midIndex+1 && j!=endIndex+1)    {        if(sourceArr[i] > sourceArr[j])            tempArr[k++] = sourceArr[j++];        else            tempArr[k++] = sourceArr[i++];    }    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];}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 argc, char * argv[]){    int a[8] = {50, 10, 20, 30, 70, 40, 80, 60};    int i, b[8];    MergeSort(a, b, 0, 7);    for(i=0; i<8; i++)        printf("%d ", a[i]);    printf("\n");    return 0;}

对于归并排序,我们可以把一列数排序,也可以把好多列数排序。

归并其实就是把这些数一个个分开,然后在一组组的有序的合并起来。

  • 第一阶段

先讲需要的变量

int sourceArr[]

这个数组用来存放排好序的数字们,

int tempArr[]

这个数组用来暂时存放数据,

int startIndex, int midIndex, int endIndex

这个是开始,中点,终点;

midIndex = (startIndex + endIndex) / 2;

找到中点,然后一分为二,直到分成一个一个的,这时候第一阶段就算是完成了;

  • 第二阶段

接下来是第二阶段,排序开始。

while(i!=midIndex+1 && j!=endIndex+1)    {        if(sourceArr[i] > sourceArr[j])            tempArr[k++] = sourceArr[j++];        else            tempArr[k++] = sourceArr[i++];    }    while(i != midIndex+1)

i 代表着前一块的数值下标,j 代表后面一段的下标

对于前后这两段的数值们,都先将指针放在第一个数值那里,然后,如果前面的大于后面的,就先将它放入temp数组里,暂时存一下,然后指针向后挪一个,以此类推,直至一方指针走到底,结束了第一段。

此时,其中一段会有剩余,接下来就将这段剩余一起放入temp数组。

这样,这两段就排好大小了,再把排好的放到source数组里存好。

一步步,直到最后排好。

这个样子,归并就结束了,来一个示意图:

两个阶段

好了,这个也结束了…

0 0
原创粉丝点击