赞
踩
一个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;
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。