一个int 数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都
大于等于它。能否只用一个额外数组和少量其它空间实现。
思想:一看这题,就想到快速排序中的 一次排序, 左边<=某个数<=右边
so: 如果原数组与排好序的数组 一一比较,a[i]==b[i] 不就是所求么?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void pr_arr(int arr[],int len)
{
if(arr==NULL || len<1) return;
pr_arr(arr,len-1);
printf("%-4d ",arr[len-1]);
}
int cmp(const void *a, const void *b)
{
return *(int *) a - *(int *) b;
}
void findNumBiggerLeftSmallerRight(int src[],int len)
{
if(src==NULL || len <1) return ;
int i=0;
int *buff=(int *)malloc(sizeof(int)*len);
memcpy(buff,src,sizeof(int)*len);
qsort(buff,len,sizeof(int),cmp);
printf("original arr:\n");
pr_arr(buff,len);
printf("\nqsort arr:\n");
pr_arr(buff,len);
printf("\nthe result:\n");
for(i=0;i<len;i++)
{
if(src[i]==buff[i])
printf("%d:%d ",i,src[i]);
}
//free
free(buff);
}
int main(void) {
int src[]={21,34,34,45,45,56,565,67,67,768,32};
findNumBiggerLeftSmallerRight(src,sizeof(src)/sizeof(int));
return 0;
}