- #include <stdio.h>
- #include <stdlib.h>
- #define MAX_SIZE 10000
- /*全局数据结构
- */
- int num;
- int arr[MAX_SIZE];
- //functions
- void input();
- void print();
- void print(int * arr,int len);
- void sort(int,int);
- int* Merge(int *arr1,int len1,int *arr2 ,int len2);
- int* Merge(int first,int last);
- void test();
- int main()
- {
- input();
- // print();
- //test();
- sort(0,num-1);
- print();
- return 0;
- }
- void sort(int first,int last)
- {
- if(last > first)
- {
- int mid = (first + last)/2;
- sort(first,mid);
- sort(mid+1,last);
- Merge(first,last);
- }
- }
- int* Merge(int first,int last)
- {
- int mid = (first + last)/2;
- int i,count = 0;
- int loop ;
- //临时向量
- int size1 = (last - first + 2)/2;
- int size2 = (last - first + 1) -size1;
- int * arr1 = (int *)malloc(sizeof(int) * size1);
- loop = first;
- for(i = 0; i < size1; ++i)
- {
- *(arr1 + i) = arr[loop];
- ++loop;
- }
- int * arr2 = (int *)malloc(sizeof(int) * size2);
- loop = first + size1;
- for(i = 0; i < size2; ++i)
- {
- *(arr2 + i) = arr[loop];
- ++loop;
- }
- int * tmparr = Merge(arr1,size1,arr2,size2);
- for(i = first;i <= last; ++i)
- {
- arr[i] = *(tmparr+count);
- ++ count;
- }
- //释放向量占用的空间
- free(tmparr);
- return arr;
- }
- int* Merge(int *arr1,int len1,int *arr2 ,int len2)
- {
- int len = len1 + len2; //新分配的数组的长度
- int * arr = (int *)malloc(sizeof(int) * len);
- int pos1 = 0,pos2 = 0; // 记录两个数组的要进行比较的数字的位置
- int pos;
- for(pos = 0; pos < len; ++pos)
- {
- //两个向量都有数据时
- if(pos1 < len1 && pos2 <len2)
- {
- if( *(arr1+pos1) <= *(arr2 + pos2) )
- {
- *(arr+pos) = *(arr1 + pos1);
- ++pos1;
- }
- else
- {
- *(arr+pos) = *(arr2 + pos2);
- ++pos2;
- }
- }
- else
- //此时,只有一个向量有数据
- {
- //向量1有数据时
- if(pos1 < len1)
- {
- for(;pos < len; ++pos)
- {
- *(arr+pos) = *(arr1+pos1);
- ++pos1;
- }
- }
- //向量2有数据时
- else
- {
- for(;pos < len; ++pos)
- {
- *(arr+pos) = *(arr2+pos2);
- ++pos2;
- }
- }
- }
- }
- //释放向量占用的空间
- free(arr1);
- free(arr2);
- return arr;
- }
- void input()
- {
- scanf("%d",&num);
- int i;
- for(i = 0; i < num; ++i)
- {
- scanf("%d",arr+i);
- }
- getchar();
- }
- void print()
- {
- int i;
- for(i = 0; i < num; ++i)
- {
- printf("%d/n",*(arr+i));
- }
- }
- void print(int * arr,int len)
- {
- int i;
- for(i = 0; i < len; ++i)
- {
- printf("%d/n",*(arr+i));
- }
- }
- void test()
- {
- int * arr1 = (int *)malloc(sizeof(int) * 6);
- int * arr2 = (int *)malloc(sizeof(int) * 8);
- int i;
- for(i = 0; i < 6; ++i)
- {
- *(arr1+i) = rand() % 30;
- if(i>0)
- {
- if(*(arr1+i) < *(arr1+i-1) )
- {
- --i;
- }
- }
- }
- for(i = 0; i < 8; ++i)
- {
- *(arr2+i) = rand() % 43;
- if(i>0)
- {
- if(*(arr2+i) < *(arr2+i-1) )
- {
- --i;
- }
- }
- }
- print(Merge(arr1,6,arr2,8),14);;
- }
闲了,再写写排序算法,一个最麻烦的归并排序。
最新推荐文章于 2024-07-19 19:11:19 发布