博文:http://blog.jobbole.com/11745/ 几种常见排序算法的视觉图。可以方便理解各种排序的思想,其中堆排序和希尔排序可能光看图看不明白,建议搜一下。
博文:http://blog.csdn.net/ios_long/article/details/7019718 指针和内存相关。里面有几个很典型的小例子。最近问这事的人挺多的,这帖子里写的比较清楚。
题目1:输入一个有序数组,和一个数k,输出数组中所有三个数的和为k的组合
/*************************************
//注意:这道题就是难题了,如果想做难题建议不要往下看,中等题和简单题的题干会对难题有提示。
//想做中等或想做简单或想看提示的请继续往下看.
*************************************/
题目2:输入一个有序数组,和一个数k,输出数组中所有两个数的和为k的组合,要求在算法的时间复杂度为o(n),(如果不懂,可以简单理解为只用一次循环)
博文:http://blog.csdn.net/ios_long/article/details/7019718 指针和内存相关。里面有几个很典型的小例子。最近问这事的人挺多的,这帖子里写的比较清楚。
题目1:输入一个有序数组,和一个数k,输出数组中所有三个数的和为k的组合
/*************************************
//注意:这道题就是难题了,如果想做难题建议不要往下看,中等题和简单题的题干会对难题有提示。
//想做中等或想做简单或想看提示的请继续往下看.
*************************************/
题目2:输入一个有序数组,和一个数k,输出数组中所有两个数的和为k的组合,要求在算法的时间复杂度为o(n),(如果不懂,可以简单理解为只用一次循环)
题目3:输入一个有序数组,和一个数k,输出数组中所有两个数的和为k的组合。
p.s. 如果想在查找三个数的函数中调用查找两个数的函数,记录结果是个麻烦事儿,注释掉的代码中会丢解,所以做一半放弃鸟。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
const int LENGTH=100;
void initializeArray(int* array,int len);
int comp(const void *a,const void *b);
void printArray(int* array,int LENGTH);
//void FindThreeNumbers(int* array,int len,int k);
//int FindTwoNumbers(int* array,int len,int k);
void FindThreeNumbers2(int* array,int len,int k);
int main()
{
int *array=malloc(sizeof(int)*LENGTH);
int k,flag=0;
initializeArray(array, LENGTH);
printf("the array is:\n");
printArray(array, LENGTH);
printf("\n");
printf("Please enter the k:\n");
scanf("%d",&k);
FindThreeNumbers2(array,LENGTH,k);
return 0;
}
void initializeArray(int* array,int len)
{
srand(time(NULL));
int i;
for(i=0;i<len;i++)
array[i]=rand()%1000-500;
qsort(array,LENGTH,sizeof(int),comp);
}
int comp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
void printArray(int* array,int len)
{
int i;
for(i=0;i<=len-1;++i)
{
printf("%7d",array[i]);
if((i+1)%5==0)
printf("\n");
}
}
/*void FindThreeNumbers(int* array,int len,int k)
{
/ int i;
for(i=2;i<len-1;i++)
{
if(FindTwoNumbers(array,i,k-array[i]))
printf("%7d\n",array[i]);
}
}
*/
/*int FindTwoNumbers(int* array,int len,int k)
{
int start=0,end=len-1;
while(start<end)
{
if(array[start]+array[end]<k)
++start;
else if(array[start]+array[end]>k)
--end;
else
{
printf("Find: %d %d ",array[start],array[end]);
++start;
--end;
return 1;
}
}
return 0;
}
*/
void FindThreeNumbers2(int* array,int len,int k)
{
int i;
for(i=2;i<len-1;i++)
{
int start=0,end=i-1;
while(start<end)
{
if(array[start]+array[end]<k-array[i])
++start;
else if(array[start]+array[end]>k-array[i])
--end;
else
{
printf("Find: %d %d %d\n",array[start],array[end],array[i]);
++start;
--end;
}
}
}
}