C语言基础总结 ( 二 )----------数组总结( 重点排序算法 )

??写一个程序,初始化一个数组。要求数组长度为10,里面的值为0-9的随机数,并且每一个数字出现一次。
思路:
 1,创建数组
 2,创建随机数
 3,存到数组中 nums[i++] = ...
 4,使用循环创建数据,并加入到数组中.循环几次? while(i < 10)
 5,创建数字,判断数组中是否有该数字,如果没有就加入,如果有就重新创建
 6,如何判断一个数字在数组中或不在数组中呢?
 int nums[] = {1,2,3};
 3在不在,4在不在?
 遍历一下,看直到遍历结束,如果都没有这个数字,就表示不存在
 数组初始化?
 
 
用代码来实现:
  int nums[LEN], i = 0, temp, index;
    while (i < 10) {
        temp = arc4random_uniform(10);
        // 循环用随机数和数组元素比较,看是否相等
        for (index = 0; index < i; index++) {
            if (temp == nums[index]) {
                break;
            }
        }
        // index == i说明for循环结束,随机数和数组元素不相等
        if (index ==  i) {
            nums[i++] = temp;
        }
    }
    // 循环结束,把随机数打印出来
    for (int j = 0; j < 10; j++) {
        printf("%d\t%d\n", j + 1, nums[j]);
    }
 
 
 
??冒泡排序
void bubbleSort(int nums[], int lengh){
    for (int i = 0; i < lengh - 1; i++) {
        for (int j = 0; j < lengh - 1 - i; j++) {
            if (nums[j] > nums[j + 1]) {
                int temp = nums[j];
                nums[j] = nums[j + 1];
                nums[j + 1] = temp;
            }
        }
    }
}
 
??选择排序
void chooseSort(int nums[], int length){
    for (int i = 0; i < length - 1; i++) {
        for (int j = i; j < length; j++) {
            if (nums[j] < nums[i]) {
                int temp = nums[j];
                nums[j] = nums[i];
                nums[i] = temp;
            }
        }
    }
}
 
??选择排序优化:
int min = -1;
    for(int j = 0; j < 4 - 1; j++) {
        min = j; // 记录了最小取值的下标(索引)
        for (int i = j + 1; i < 4; i++) {
            if(nums[min] > nums[i]) {
                min = i;
            }
        }
       
        // 将最小的与第j项交换
        if(min != j) {
            temp = nums[min];
            nums[min] = nums[j];
            nums[j] = temp;
        }
    }
 
 
??二分法查找数据  前提:数组是从小到大排列的
// 二分法就是折中来求,目标数据大于中间数,就在右半边中找,循环执行...
// 假定找到目标数据,就返回它的下标,如果没找到,就返回-1
int indexOf(int nums[], int length, int keydata){   // keydata 表示要找的目标数据
// 由于要执行循环的次数未知,所以用while循环来实现
    int low = 0, high = length - 1,mid;
    while (low <= high) {
        mid = (low + high) / 2;
        if (keydata == nums[mid]) {
            return mid;
        }else if (keydata > nums[mid]){
            low = mid + 1;
        }else high = mid - 1;
    }
    return -1;
}
 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。