这道题我特别偷懒的用了一个辅助数组,然后从前到后扫描一边辅助数组,将小于0和大于0的,分别放到原数组的两头,这样的实现算是一个变相的归并了吧,哈哈。
但是我这里移动次数固定为n
但是如果用快排的话,最大移动次数才仅仅为n/2
所以这么来看的话,快排好像略胜一筹~
这道题显然归并和快排都可以做,因为其只需找到一次位置就可以。
#include<stdio.h>
//快排,归并都可以
//不过快排好像还要找一下0,这就要循环一遍,时间复杂度为n了
//按归并来写吧. 不顾归并有一个将元素复制到辅助数组的步骤,感觉两种方法差不多吧
//我这个最大移动次数为n次,感觉我这个太简单了,利用了一个辅助数组
//别人都是从两边交替向中间扫描,然后交换大于0和小于0的,这样就不用先找到0元素了
//快排可以参照这里:https://www.cnblogs.com/kangjianwei101/p/5609105.html
void printArray(int a[],int n);
void __mergeSort(int arr[],int low,int high)
{
int number = high - low + 1;
int aux[ number ];
for(int i = 0;i < number; i++)
{
aux[i] = arr[i+low];
}
int i = low ; int k = high;
for(int j = 0;j < number ; j++)
{
if(aux[j] < 0)
{
arr[low] = aux[j];
low ++ ;
}
else
{
arr[k] = aux[j];
k -- ;
}
}
}
void mergeSort(int arr[],int n)
{
__mergeSort(arr,0,n-1);
}
void printArray(int a[],int n)
{
int i;
for(i = 0;i < n ; i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
int main(int argc, char const *argv[])
{
int a[8]={8,-3,6,2,-9,5,-1,4};
mergeSort(a,8);
printArray(a,8);
return 0;
}