美文网首页
数组排序与折半查找

数组排序与折半查找

作者: silasjs | 来源:发表于2018-04-06 13:20 被阅读0次

声明一个数组

int arr[] = {12, 33, 8, 24, 10, 22, 40, 18, 37};
int count = sizeof(arr) / sizeof(arr[0]);
printArray(arr, count);

再声明用来打印数组和交换两个变量的值的function

void printArray(int arr[], int length) {
    printf("%s\n", __func__);
    
    for (int i = 0; i < length; i++) {
        printf("%i   ", arr[i]);
    }
    printf("\n");
}

void swap(int arr[], int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

选择排序

拿其中一个值和其他值依次比较,完全比较一轮后,最值出现在第0位。

//选择排序
void sortArray1(int arr[], int count) {
    for (int i = 0; i < count - 1; i++) {
        for (int j = i + 1; j < count; j++) {
            if (arr[i] > arr[j]) {
                swap(arr, i, j);
            }
        }
    }
}

冒泡排序

用相邻的两个元素进行比较,每比较完一轮,最值出现在末尾。

//冒泡排序
void sortArray2(int arr[], int count) {
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(arr, j, j + 1);
            }
        }
    }
}

输出结果

printArray
12   33   8   24   10   22   40   18   37   
printArray
8   10   12   18   22   24   33   37   40  

折半查找

  • 原理:
  1. 数组必须是有序的
  2. 必须已知min和max
  3. 动态计算mid的值,取出mid对应的值进行比较
  4. 如果mid对应的值大于了需要查找的值,那么max要变小为mid-1
  5. 如果mid对应的值小于了需要查找的值,那么min要变大为mid+1
//折半查找法
int findKey1(int arr[], int count, int key) {
    int min = 0;
    int max = count - 1;
    int mid = (max + min) / 2;
    while (key != arr[mid]) {
        if (key > arr[mid]) {
            min = mid + 1;
        } else if (key < arr[mid]) {
            max = mid - 1;
        }
        //超出范围,返回-1,说明没有在数组中找到。
        if (min > max) {
            return -1;
        }
        mid = (max + min) / 2;
    }
    return mid;
}

相关文章

  • 数组排序与折半查找

    声明一个数组 再声明用来打印数组和交换两个变量的值的function 选择排序 拿其中一个值和其他值依次比较,完全...

  • 冒泡排序,选择排序,折半查找

    选择排序 冒泡排序 折半查找(只适用于已经排好序的数组) swap函数(交换数组中两个数的位置)

  • 算法复习-插入类排序(2)-折半插入排序

    折半插入排序 折半插入排序是根据折半查找法来查找插入位置的。折半查找的一个基本条件是序列已经有序。而从直接插入排序...

  • C语言折半查找

    折半查找 折半查找的注意点折半查找只能查找有序数组的值 折半查找的逻辑1.把数组第一个元素的索引作为最小值,最后一...

  • Java 数组折半查找

    java 数组折半查找

  • leetcode-0004

    题目: 4. 寻找两个有序数组的中位数 关键词:排序 折半查找 思路: 查找第k个数,每次查找二个数组的第k/2位...

  • 二分查找

    概念二分查找又叫折半查找,从排序数组中查找元素的位置。 图示二分查找 Java实现 复杂度T(n)=T(n/2)+...

  • 【数据结构】【C#】014-插入类排序:🥈折半插入排序(稳定)

    插入排序:折半插入排序(稳定) 【 算法思想 】 从关于查找的讨论中可知,对于有序表进行折半查找,其性能优于顺序查...

  • 冒泡排序与折半查找

    冒泡排序:相邻的两个元素比较,符合条件交换位置 折半查找的使用前提是数据必须是有序的。

  • 2.3 二分查找的递归与非递归实现

    Chapter2: 时间复杂度分析、递归、查找与排序 3. 二分查找的递归与非递归实现 二分查找即折半查找,为查找...

网友评论

      本文标题:数组排序与折半查找

      本文链接:https://www.haomeiwen.com/subject/yefshftx.html