實驗8.1 歸併排序
阿新 • • 發佈:2021-01-17
文章目錄
標頭檔案
#include<stdio.h>
int num = 0;
輸出數
void print_data(int data[], int first, int last)
{
int i = 0;
for (i = 0;i < first;i++)
printf("*");
for (i = first;i <= last;i++)
printf("%3d", data[i]);
for (i = last;i <= 8;i++)
printf("*");
printf("\n");
}
一趟歸併
void merge(int array[], int first, int last)
{
int mid, i1, i2, i3;
int temp[10];
int i, j;
mid = (first + last) / 2;
i1 = 0;
i2 = first;
i3 = mid + 1;
while (i2 <= mid && i3 <= last) //以mid分割開兩個歸併序列,以前面序列的第一個元素和後面序列的第一個元素對比,小的放入新生成的序列中
{
if (array[i2] < array[i3])
temp[i1++] = array[i2++];
else
temp[i1++] = array[i3++];
}
if (i2 <= mid) //後面的序列已經全部放進新生成的序列中去了,但前面的序列還有一部分殘餘
{
while(i2<=mid) //直接將未放入新生成序列的元素放入
temp[i1++] = array[i2++];
}
if (i3 <= last) //前面的序列全部放進去了,但後面的序列還有一部分殘餘
{
while(i3<= last)
temp[i1++] = array[i3++];
}
for (i = first, j = 0;i <= last;i++, j++)
array[i] = temp[j]; //將舊的序列用新的序列覆蓋
print_data(array, first, last);
}
歸併排序
void mergesort(int data[], int first, int last)
{
int mid;
if (first < last)
{
mid = (first + last) / 2;
mergesort(data, first, mid);
mergesort(data, mid + 1, last);
merge(data, first, last);
}
}
主函式
int main()
{
int a[] = { 1,8,6,4,10,5,3,2,22 };
mergesort(a, 0, 8);
}