黑马程序员技术交流社区

标题: 曾经头疼的排序 今天终于被我拿下了 [打印本页]

作者: 普通蜗牛    时间: 2015-7-23 21:02
标题: 曾经头疼的排序 今天终于被我拿下了
冒泡排序:
#include <stdio.h>
#include <stdlib.h>//生产随机数函数要用
#define N 10    //宏定义
int main(int argc, const char * argv[]) {

    //题目:给数组赋值随机数,并从大到小排序
   
    //定义数组
    int a[N];
    //定义控制变量i
    int i;
    //定义随机数
    int randomNum;
    //for循环对数组进行初始化
    for (i=0; i<N; i++) {
        //产生随机数
        randomNum=arc4random_uniform(50);
        //赋值给数组
        a[i]=randomNum;
        
    }
    //为便于验证已成功赋值 遍历输出数组中的元素
    printf("数组元素为:\n");
    for (i=0; i<N; i++) {
        printf("%d\t",a[i]);
    }
   
    printf("\n");
    //声明排序函数
    void bubbleSort(int a[ ], int n);
   
    int len =sizeof(a)/sizeof(int);//数组长度
    //调用排序函数
    bubbleSort(a, len);//数组作为函数参数传值时传递数组名
    //排序后 遍历输出数组中的元素
    printf("排序后顺序为:\n");
    for (i=0; i<N;i++) {
        printf("%d\t",a[i]);
    }
    printf("\n");
   
    return 0;
}

//定义排序函数
void bubbleSort(int a[ ], int n){//写函数时不要把数组长度写上
    for (int j=0; j<n-1; j++) {//如果有n个数 则遍历n-1趟 所以j从0开始到小于n-1
        for (int i=0; i<n-j-1;i++) {//第j趟有j个数字已经有序 没必要继续比较
                                        // 所以  是n-j-1;
            if (a[i]>a[i+1]) {
                int temp=a[i];
                a[i]=a[i+1];
                a[i+1]=temp;
            }
        }
    }
   
}



选择排序:
#include <stdio.h>
//选择排序 将最小值放在最开始的位置 以打擂台的形式进行
int main(int argc, const char * argv[]) {
   
    int a[7]={45,23,6,2,77,34,74};      //定义一个数组
   
    int len=sizeof(a)/sizeof(int);     //定义数组长度,并赋值
    void xuanZe(int a[],int len);      //声明函数
    xuanZe(a, len);                     //调用函数
    printf("\n");                       // 输出结果后 换行
    return 0;
}
void xuanZe(int a[],int len){            //定义函数时 形参的类型也要注明
    int i,j;                              //定义循环控制变量
   
    for (i=0; i<len-1; i++) {
        for (j=i+1; j<len-1-i; j++) {//用a[i]跟数组中其他的值进行比较
            //在内层循环  只有j++  i不变
            if (a[i]>a[j]) {         //判断a[i]与a[j]谁小 把小的赋值给a[i]
                int temp=a[i];
                a[i]=a[j];
                a[j]=temp;
            }
        }
    }
    for (i=0; i<len; i++) {     //选择排序完成后 遍历数组 输出排序结果
        printf("%d\t",a[i]);
    }
}




折半排序:

#include <stdio.h>
// 0  1  2  3  4
// 2  4  5  7  35
int zheBan(int a[],int key,int len){
    int low=0;                    //定义一个低位
    int high=len-1;                 //定义一个高位
    while (low<=high) {
        
        int mid=(low+high)/2;       //取一个中间位置
        if (a[mid]<key) {      //如果中间位置的值比要查找的值小 则从右区间进行查找
            low=mid+1;        //改变低位的值 更改查找区间
        }else if (a[mid]>key){   //若中间值大于要查找的值,则从左区间进行查找
            high=mid-1;     //改变高位的值  更改查找区间
        }else{
            printf("找到了,a[%d]==%d\n",mid,key);
                            //如果相等 则输出已经找到该数字
            return mid;
        }
    }
    // 0  1  2  3  4
    // 2  4  5  7  35
    printf("没有找到\n");    //当while的条件不再成立时  输出没有找到该数字
    return 0;
}
int main(int argc, const char * argv[]) {
   
    int a[5]={2,4,5,7,35};          //定义一个有序数组(数字由小到大排列)
    zheBan(a, 7, 5);              //调用函数
   
   
    return 0;
}

作者: ylxkab    时间: 2015-7-23 21:13
搞点题练练手就好啦

作者: 手残程序员    时间: 2015-7-23 21:21
努力就有收获
作者: 黑马灬小胖纸    时间: 2015-7-23 21:38
冒泡排序以前我也是比较头疼,主要在于调用函数那块没看懂
作者: 花漾    时间: 2015-7-23 22:05
恭喜恭喜!!
作者: 我的呸    时间: 2015-7-23 22:08
加油。。。
作者: Foreversidy夏末    时间: 2015-7-23 22:11
继续努力!!!
作者: shorfng    时间: 2015-7-23 22:20
不错,不错。加油
作者: chensc    时间: 2015-7-24 06:28
学习学习!
作者: wy911011    时间: 2015-7-24 08:19
加油吧,骚年
作者: 562413895@qq.co    时间: 2015-7-24 08:58
这三种排序了解了思想以后,自己动手写并且运行正确才是真的
作者: skywan    时间: 2015-7-24 09:05
每天进步一点点




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