例如已知数组a前半部分a[0,mid - 1],后半部分a[mid,num-1],现前半部分和后半部分均已排好序。
要求:实现a数组的从小到大排序。空间复杂度为O(1).(百度笔试)
- #include <stdio.h>
- void MergeIntData(int *a, const unsigned int num, const unsigned int mid)
- {
- if(mid < 0 || num < 0 || NULL == a || a[mid - 1] <= a[ mid ])
- return;
- unsigned int i,temp, low = 0, high = 0;
- if(mid <= num / 2)
- {
- while(low < mid)
- {
- while(a[low] < a[mid + high])//不能加等号,否则如果有连续相等在一起的数据,会出现错误
- {
- ++ low;
- }
- while(a[mid + high + 1] < a[low])
- {
- ++ high;
- if(high >= num - mid)
- {
- high = num - mid - 1;
- break;
- }
- }
- temp = a[low];
- for(i = low; i < mid + high; ++ i)
- {
- a[i] = a[i + 1];
- }
- a[mid + high] = temp;
- }
- }
- else
- {
- while(high < num - mid)
- {
- while(a[low] < a[mid + high])
- {
- ++ low;
- }
- temp = a[mid + high];
- for(i = mid + high; i > low; -- i)
- {
- a[i] = a[i - 1];
- }
- a[low] = temp;
- ++ high;
- }
- }
- }
- int main()
- {
- // int a[] = {0,2,4,6,8,9,10,11,12,14,16,18,1,3,5,7};
- // int a[] = {0,2,4,6,8,8,9,9,1000,1,3,5,7,10,11,12,14,16,18,20,21,23,25,45,68};
- // int a[] = {100,1,3,5,7,10,11,12,14,16,18,20,21,23,25,45,68};
- // int a[] = {8,8,8,9,9,1,5,8,9,10,12,13,14};
- // int a[] = {1,2,3,4,5,6,7,8,9,2,4,5,7,8,9,10};
- // int a[] = {0,1,2,3,4,5,6,7,8,9,9,17,100,5,5,5,5,9,10,10000};
- int a[] = {1,2,3,4,5,6,7,100,1000,2,3,5,6,8,1001};
- int len = sizeof(a) / sizeof(int);
- int mid = 9;
- MergeIntData(a, len, mid);
- for(int i = 0; i < len; ++ i)
- {
- printf("%d ", a[i]);
- }
- printf("\n");
- return 0;
- }