黑马程序员技术交流社区

标题: [一定要看哦] C 中数据的排序算法 [打印本页]

作者: 你说呢    时间: 2015-7-15 16:25
标题: [一定要看哦] C 中数据的排序算法
#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;
                        }
                }
        }       
}
作者: 294250051    时间: 2015-7-15 17:23
你这根本不是冒泡和选择。自己好好看看书吧。你这是完全自己写的经过了无数次交换得到你要的结果。
作者: 你说呢    时间: 2015-7-16 11:00
294250051 发表于 2015-7-15 17:23
你这根本不是冒泡和选择。自己好好看看书吧。你这是完全自己写的经过了无数次交换得到你要的结果。 ...

有些不解......不是这样的么
请指教.....
作者: 294250051    时间: 2015-7-16 11:09
你说呢 发表于 2015-7-16 11:00
有些不解......不是这样的么
请指教.....

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

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


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



作者: 294250051    时间: 2015-7-17 10:02
你说呢 发表于 2015-7-16 11:22
比如说选择排序从小到大的排
你是说每次选择一个最小放在第一位,然后再从剩下的中找到最小的当在第二位. ...

冒泡排序是相邻的元素交换。而选择排序是遇到合适的值先保存其下标,然后再交换。你上面的程序也对,只是交换了许多不必要的次数,你可以看一下网上其他的选择排序法的版本,应该会有储存下标一说。
作者: 你说呢    时间: 2015-7-17 10:26
本帖最后由 你说呢 于 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;
        }        

谢谢了


作者: 294250051    时间: 2015-7-17 10:54
你说呢 发表于 2015-7-17 10:26
int min,temp;
        for(int i=0;i

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

算法本来就是这样,,,,,语言都相差不大。。。只不过写法不太一样而已
作者: 蓝蓝    时间: 2015-7-20 09:04
学习了!!!!
作者: chensc    时间: 2015-7-20 18:59
学习学习!
作者: 562413895@qq.co    时间: 2015-7-20 19:10
吼吼,C语言课本上有
作者: 糖糖本尊    时间: 2015-7-20 21:28
看不懂 看的头晕
作者: zpy_0806    时间: 2015-7-20 21:39
楼主的学习劲头真好
作者: huguozhang    时间: 2015-7-21 00:10
学习~~~~~~~~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2