常见的冒泡排序、顺序查找和对半查找

妖狐艹你老母 2023-03-14 10:51 125阅读 0赞

关于一维数组的排序和查找

  • 排序算法
    • 冒泡排序
    • 改进的冒泡排序
  • 查找算法
    • 顺序查找
    • 对半查找

    先看例题

    从键盘上任意输入8个整数,用冒泡排序法对8个数排序(由小到大)

从键盘上输入整数,利用for循环输入

  1. printf("输入要输入的整数个数:");
  2. scanf("%d",&max);
  3. int ia[max];
  4. printf("输入数组元素:\n");
  5. for(i=0;i<max;i++)
  6. {
  7. scanf("%d",&a[i]);
  8. }

排序算法

冒泡排序

思路:升序
通过相邻之间的比较和交换,使值较小的数逐渐从底部移向顶部,值较大的数逐渐移向底部;

就像水底的气泡一样逐渐向上冒;

  1. ======================================
  2. 原数据 第一轮 第二轮 第三轮 第四轮
  3. 2 2 2 2 1
  4. 5 4 3 1 2
  5. 4 3 1 3 3
  6. 3 1 4 4 4
  7. 1 5 5 5 5
  8. ======================================
  9. 将原数据序列 25431 按升序排列
  10. ------------------
  11. 第一轮结束时,5沉底
  12. 第二轮结束时,4沉底
  13. 第三轮结束时,3沉底
  14. 第四轮结束时,2沉底
  15. ------------------
  16. 从而得到从小到大的序列

a[0] ~ a[n-1]组成的n个数据,从小到大进行冒泡排序的过程描述

  1. 首先将相邻的a[0]a[1]进行比较,如果a[0]的值大于a[1]的值,则交换两者的位置,使较小的上浮,较大的下沉;接着比较a[1]与a[2],同样使小1的上浮,大的下沉,以此类推,直到比较完a[n-2]a[n-1];此时,a[n-1]为最大值的元素,第一趟排序结束
  2. 然后在a[0] ~ a[n-2]区间内,进行第二趟排序,使剩余元素中最大的元素下沉到a[n-2]
  3. 直到整个数组有序,上述“下沉”的过程最多需要重复进行n-1次

    if 0

    简单的冒泡排序

    endif

    include

    int main(void)
    {

    1. int a[8]={ 19,9,87,12,-76,0,-45,123}; /*初始化数组*/
    2. int i,j,t; /*定义循环变量和临时变量*/
    3. printf("待排序数组:\t");
    4. for(i=0;i<8;i++)
    5. {
    6. printf("%6d",a[i]); /*宽度为6*/
    7. }
    8. printf("\n");
    9. /*开始排序(冒泡排序)*/
    10. for(j=0;j<8-1;j++) /*外循环:控制循环次数(两个两个比较只需比较8-1次)*/
    11. {
    12. for(i=0;i<8-1-j;i++) /*内循环:每趟参与比较的元素个数(每交换一次,减少一个需要比较元素)*/
    13. {
    14. if(a[i]>a[i+1]) /*升序排列*/
    15. {
    16. t=a[i];
    17. a[i]=a[i+1];
    18. a[i+1]=t;
    19. }
    20. }
    21. /*每趟循环结束打印一下排序的结果*/
    22. printf("第%d趟比较结束:\t",j+1);
    23. for(i=0;i<8;i++)
    24. {
    25. printf("%6d",a[i]);
    26. }
    27. printf("\n"); /*换行*/
    28. }
    29. /*输出排序后的数据*/
    30. printf("排序结束后:\t");
    31. for(i=0;i<8;i++)
    32. {
    33. printf("%6d",a[i]);
    34. }
    35. printf("\n");

    }

在这里插入图片描述

改进的冒泡排序

思路
排序过程通过嵌套for循环完成,对8个元素的数组,一共进行7趟比较,每趟进行(7-j)次比较,以决出一个最大值

从上面的结果可以看出,在进行到第5趟时,数组已经排序完成,并必须要接着再循环,可以跳出,不用再判断了

  1. #if 0
  2. 改进的冒泡排序(flag判断数据是否发生交换)
  3. #endif
  4. #include<stdio.h>
  5. int main()
  6. {
  7. int a[8]={ 19,9,87,12,-76,0,-45,123}; /*初始化数组*/
  8. int i,j,t; /*定义循环变量和临时变量*/
  9. printf("待排序数组:\t");
  10. for(i=0;i<8;i++)
  11. {
  12. printf("%6d",a[i]); /*宽度为6*/
  13. }
  14. printf("\n");
  15. int flag=0; /*flag用来判断是否有交换*/
  16. for(j=0;j<8-1;j++)
  17. {
  18. for(i=0;i<8-1-j;i++)
  19. {
  20. if(a[i]>a[i+1])
  21. {
  22. t=a[i];
  23. a[i]=a[i+1];
  24. a[i+1]=t;
  25. flag=1; /*上面的if语句成功执行,则说明数据发生交换*/
  26. }
  27. }
  28. if(flag==1)
  29. {
  30. flag=0; /*若发生交换,则flag赋为0,以便下一次循环判断*/
  31. }
  32. else
  33. {
  34. break; /*无交换,跳出循环,不再判断*/
  35. }
  36. /*每趟循环结束打印一下排序的结果*/
  37. printf("第%d趟比较结束:\t",j+1);
  38. for(i=0;i<8;i++)
  39. {
  40. printf("%6d",a[i]);
  41. }
  42. printf("\n"); /*换行*/
  43. }
  44. }

在这里插入图片描述


  1. 再看查找的题目
  2. 假设数组a10个互不相同且从小到大排列的数,
  3. 从键盘上再输入一个同类型的数x,在数组中查找x,如果找到,输出相应的下标,否则输出“未找到”

查找算法

顺序查找

过程:
x与数组a中从第一个元素对比,若相等则结束查找;否则继续与第二和元素对比,重复上述过程直到数组的最后一个元素。若数组结束还未找到,则输出“未找到”

注意!!!:当数据量过大时,查找效率较低

  1. #if 0
  2. 顺序查找(找到输出下标,否则输出未找到)
  3. #endif
  4. #include<stdio.h>
  5. int main()
  6. {
  7. int x,i,a[10]={ 2,3,5,8,12,13,14,16,18,25};
  8. printf("输入待查找数据:");
  9. scanf("%d",&x);
  10. for(i=0;i<10;i++) /*找到,则结束循环*/
  11. {
  12. if(x==a[i])
  13. {
  14. break;
  15. }
  16. }
  17. if(i==10) /*不管找不找得到,当遍历整个数组后,必须结束循环*/
  18. {
  19. printf("数组中未找到%d\n",x);
  20. }
  21. else
  22. {
  23. printf("找到了,%d是数组中的第%d个元素\n",x,i+1);
  24. }
  25. }

在这里插入图片描述
在这里插入图片描述

对半查找

又称折半查找或者二分法,算法要求待查数组是有序排列的

过程:
首先比较x数组a中间元素,如果相等则查找成功;否则,若x较小,则它只可能在数组a的前半部分反之则在后半部分,这样每次比较结束,可将搜索范围缩小一半

核心思想:

  1. 设下界low=0,上界high=9
  2. low<high时循环
  3. {
  4. 计算中间元素下标值:mid=(low+high)/2
  5. x=a[mid],查找成功,结束循环
  6. x<a[mid],则调整上界high=mid-1
  7. x>a[mid],则调整下界low=mid+1
  8. }
  9. #if 0
  10. 对半查找(找到输出下标,否则输出未找到)
  11. 也称【二分查找】
  12. 要求数组是--有序排列
  13. #endif
  14. #include<stdio.h>
  15. int main()
  16. {
  17. int x,i,a[10]={ 2,3,5,8,12,13,14,16,18,25};
  18. printf("输入待查找数据:");
  19. scanf("%d",&x);
  20. int low,high,mid,n=0;
  21. low=0; /*设定查找范围*/
  22. high=10-1;
  23. while(low<=high)
  24. {
  25. n++; /*记录比较次数*/
  26. mid=(low+high)/2;
  27. printf("第%d次比较,low=%d,high=%d,mid=%d\n",n,low,high,mid);
  28. if(x==a[mid])
  29. {
  30. break; /*找到,及跳出循环*/
  31. }
  32. else if(x<a[mid])
  33. {
  34. high=mid-1; /*到前半部分查找*/
  35. }
  36. else
  37. {
  38. low=mid+1; /*到后半部分查找*/
  39. }
  40. }
  41. if(low>high)
  42. {
  43. printf("数组中未找到%d\n",x);
  44. }
  45. else
  46. {
  47. printf("找到了,%d是数组中第%d个元素\n",x,mid+1);
  48. }
  49. }

在这里插入图片描述
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,125人围观)

还没有评论,来说两句吧...

相关阅读