用指针进行字符串选择排序

 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    ;

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7752318
  • 这篇博客也不错, 你可以看下单片机之间通过串口通信传输数据的传输帧协议设计思路及多字节数据与浮点数的发送接收方法
  • 除此之外, 这篇博客: 从时间复杂度和空间复杂度来看斐波那契数列中的 首先我们来看一下什么叫斐波那契数列: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    斐波那契数列是指这样一个数列:

    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);但现在随着硬件的发展,空间复杂度已经不那么重要了。
    所以总体来说非递归的算法效率更高。

  • 您还可以看一下 魏老师老师的从零搭建英伟达平台远程开发调试环境课程中的 远程启动需要图形解码的应用程序以及开机启动部署小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    回答:

    使用指针进行字符串选择排序的代码是正确的,但在交换的时候需要进行下标交换,将指针指向的值进行交换。如果只是交换指针本身,实现不了字符串交换的效果。

    下面是使用指针进行字符串选择排序的示例代码:

    #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;
    }
    

    这里使用了双重循环的选择排序算法,其中交换操作是通过交换指针指向的值来实现的。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^