A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

#include<stdio.h>
int main(){
        int sum,key;//sum为查找数字的下标 key 要查找的数字
        int searchItem(int arr[],int len,int key);//声明折半查找
        void maopao(int arr[],int len);//声明冒泡排序
        void selectSort(int arr[],int len);//声明选择排序
       
       
        int a[10]={10,20,82,6,4,59,11,96,31,13};//定义并初始化数组
        int len= sizeof(a)/sizeof(int);//len 数组的长度
        maopao(a,len);//调用冒泡排序
        //输出数组
        for(int i=0;i<len;i++){
                printf("%d\t",a[i]);
        }
        printf("qingshurushuzi:\n");//输入查询的数字
        scanf("%d",&key);       
        sum=searchItem(a,len,key);//使用折半查询
        printf("%d\n",sum);
        printf("\n");
        selectSort(a,len);//调用选择排序
        for(int i=0;i<len;i++){
                printf("%d\t",a[i]);
        }
}
//折半查找
int        searchItem(int arr[],int len,int key){
        int low =0,high=len-1,mid;
        while(low<=high){
                mid=(low+high)/2;
                if(key>arr[mid]){
                        low=mid+1;       
                }
                else if(key<arr[mid]){
                        high=mid-1;       
                }else
                return mid;
        }
        return -1;
}
//冒泡排序
void maopao(int arr[],int len){
        int temp;
        for(int i=0;i<len-1;i++){
                for(int j=0;j<len-1-i;j++){
                        if(arr[j]>arr[j+1]){
                                temp = arr[j];
                                arr[j]=arr[j+1];
                                arr[j+1]=temp;
                        }
                }
        }
}
//选择排序
void selectSort(int arr[],int len){
        int temp;
        for(int i=0;i<len-1;i++){
                for(int j=i+1;j<len;j++){
                        if(arr[i]>arr[j]){
                                temp = arr[i];
                                arr[i]=arr[j];
                                arr[j]=temp;
                        }
                }
        }       
}

16 个回复

倒序浏览
你这根本不是冒泡和选择。自己好好看看书吧。你这是完全自己写的经过了无数次交换得到你要的结果。
回复 使用道具 举报
294250051 发表于 2015-7-15 17:23
你这根本不是冒泡和选择。自己好好看看书吧。你这是完全自己写的经过了无数次交换得到你要的结果。 ...

有些不解......不是这样的么
请指教.....
回复 使用道具 举报
你说呢 发表于 2015-7-16 11:00
有些不解......不是这样的么
请指教.....

比方说你那个选择排序法,选择排序是记录下当前一趟运算最符合条件的值的下标,一趟比较结束之后进行一次交换,所以说选择排序法最多进行n-1次交换。我没有看到你选择排序记录下标的语句。你可以debug一下,你会发现你的程序交换了很多很多次,显然不符合选择排序的定义额~
回复 使用道具 举报
你说呢 发表于 2015-7-16 11:00
有些不解......不是这样的么
请指教.....

冒泡是对的,我没看清你上面那个len-1-i,不好意思~
努力学习,好好加油
回复 使用道具 举报
本帖最后由 你说呢 于 2015-7-16 11:38 编辑
294250051 发表于 2015-7-16 11:09
比方说你那个选择排序法,选择排序是记录下当前一趟运算最符合条件的值的下标,一趟比较结束之后进行一次 ...


比如说选择排序从小到大的排
你是说每次选择一个最小放在第一位,然后再从剩下的中找到最小的当在第二位.....
但我看视频是这样的


回复 使用道具 举报
你说呢 发表于 2015-7-16 11:22
比如说选择排序从小到大的排
你是说每次选择一个最小放在第一位,然后再从剩下的中找到最小的当在第二位. ...

冒泡排序是相邻的元素交换。而选择排序是遇到合适的值先保存其下标,然后再交换。你上面的程序也对,只是交换了许多不必要的次数,你可以看一下网上其他的选择排序法的版本,应该会有储存下标一说。
回复 使用道具 举报
本帖最后由 你说呢 于 2015-7-17 11:13 编辑
294250051 发表于 2015-7-17 10:02
冒泡排序是相邻的元素交换。而选择排序是遇到合适的值先保存其下标,然后再交换。你上面的程序也对,只是 ...

       int min,temp;
        for(int i=0;i<len;i++){
                for (int m=i+1;m<len;m++){
                        min=str;
                        if(min>str[m]){
                                min=str[m];
                                temp = m; //记录下标变量
                        }
                }
              //数值交换
                int a;//临时变量
                a=str
;
                str
=str[temp];
                str[temp]=a;
        }        

谢谢了

回复 使用道具 举报
你说呢 发表于 2015-7-17 10:26
int min,temp;
        for(int i=0;i

祝你学习愉快,你的学习精神很足!很认真!
回复 使用道具 举报
冒泡排序是相邻2个元素比较,,每次得到最大的值,选择排序是从第一个数开始跟后面的所有数依次比较,得到最小的数.楼主的代码虽然是C的,跟Java的写法相差不大.
回复 使用道具 举报
China_Riven 发表于 2015-7-17 12:49
冒泡排序是相邻2个元素比较,,每次得到最大的值,选择排序是从第一个数开始跟后面的所有数依次比较,得到最小 ...

算法本来就是这样,,,,,语言都相差不大。。。只不过写法不太一样而已
回复 使用道具 举报
学习了!!!!
回复 使用道具 举报
学习学习!
回复 使用道具 举报
吼吼,C语言课本上有
回复 使用道具 举报
看不懂 看的头晕
回复 使用道具 举报
楼主的学习劲头真好
回复 使用道具 举报
学习~~~~~~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马