main()
{
char *s[5]={ "python","java","c++","basic","pascal" }; char *t;
int i, j, n=5, k; for(i=0;ik=i ; for(j=i+1;jif(strcmp(s[j],s[k])<0)
k=j ;
if(i!=k)
{
*t=k ;
k=i ;
i=*t ;
}
}
for(i=0;i
请问这个代码正确嘛 为什么在交换内容的时候进行下标交换呢,这样能起到交换的作用嘛
你修改的是i和k的值,跟数组没有一毛钱关系
改为strcpy给字符串赋值
这里多说两句
索引只是用来指示要操作的是第几个字符串,它不是字符串本身
好比你写了个搬家方案,把房间每块底板都标了号,11号底板上的东西要搬到202号去
那你在图上把11改成202就算搬家搬完了吗
这样不能起到交换的作用,应该是
*t=s[k] ;
s[k]=s[i] ;
s[i]=*t ;
不知道你这个问题是否已经解决, 如果还没有解决的话:斐波那契数列是指这样一个数列:
1 1 2 3 5 8 13 21 34 55 ~ ~ ~等这样的一组数列。
它的规律是第三个数等于前两个数之和
#include<stdio.h>
#include<stdlib.h>
int Fibonacci_1(size_t n)//注意返回值可能会很大,但c语言中最大整数为4294967295
{ //测试后只能计算前46个斐波那契额数列
int first,second,third;//非递归算法
int i;
first=0;
second=1;
if(n<=2)
{
return 1;
}
for(i=2; i<=n; i++)
{
third=first+second;
first=second;
second=third;
}
return third;
}
int Fibonacci_2(size_t n)//递归算法
{
if(n<=2)
{
return 1;
}
else
return Fibonacci_1(n-1)+Fibonacci_1(n-2);
}
int main()
{
size_t n=40;
printf("非递归算法第%d个斐波那契数为>:%d\n",n,Fibonacci_1(n));
printf("递归算法第%d个斐波那契数为>:%d\n",n,Fibonacci_2(n));
system("pause");
return 0;
}
运行结果如下:
两个代码看起来相差不了多少,但从时间复杂度和空间复杂度上比较,还是相差很远的。
时间复杂度:
递归算法:
非递归: 通过观察循环次数就可以发现,非递归只需要循环 n次就可以计算出第n个斐波那契数,所以它的时间复杂度时O(n);
这时当假如n为100时,递归算法需要计算2^100次,二非递归只需要计算100次,这时候递归算法可能需要很长一段时间,而非递归却很快,这就通过时间复杂度体现了两者算法的差别。
空间复杂度 :
而非递归方法开辟了三个变量空间,空间复杂度为O(1),而递归的是O(n);但现在随着硬件的发展,空间复杂度已经不那么重要了。
所以总体来说非递归的算法效率更高。
回答:
使用指针进行字符串选择排序的代码是正确的,但在交换的时候需要进行下标交换,将指针指向的值进行交换。如果只是交换指针本身,实现不了字符串交换的效果。
下面是使用指针进行字符串选择排序的示例代码:
#include <stdio.h>
#include <string.h>
void Sort(char** strArray, int n)
{
int i, j, minIndex;
char* tempStr;
for(i = 0; i < n-1; i++)
{
minIndex = i;
for(j = i+1; j < n; j++)
{
if(strcmp(strArray[j], strArray[minIndex]) < 0)
{
minIndex = j;
}
}
if(minIndex != i)
{
tempStr = strArray[minIndex];
strArray[minIndex] = strArray[i];
strArray[i] = tempStr;
}
}
}
int main()
{
int i;
char* strArray[] = {"hello world", "apple", "banana", "pear", "orange"};
int n = sizeof(strArray)/sizeof(char*);
printf("before sort:\n");
for(i = 0; i < n; i++)
{
printf("%s\n", strArray[i]);
}
Sort(strArray, n);
printf("after sort:\n");
for(i = 0; i < n; i++)
{
printf("%s\n", strArray[i]);
}
return 0;
}
这里使用了双重循环的选择排序算法,其中交换操作是通过交换指针指向的值来实现的。