数组排序,查找

简介: 数组排序,查找

前言

学习3种数组排序,2种查找法方法:

排序方法:选择法排序,直接法排序,冒泡法排序

查找方法:顺序查找。2分查找法

在这里我认为看会代码就是最好的我解释,当然注释也是非常重要的,

1.选择法排序

一般常用方法

选择法排序。从键盘输入10个数,要求按升序排序,输出排序结果 f

(1)利用循环语句由键盘输入10个数依次放入a数组。{k= for(i=①第1轮用a[0]依次与 a[1],a[2],…,a[9]进行比较,若次序不对就交换。本轮结束后,a[0]中就是10个数中的最小数。

②第2轮用a[1]依次与a[2],…,a[9]进行比较,处理方法与①相同。[1]中为10个数中的次小数。

③重复上述过程,至第9轮,比较a[8]与a[9],把小者存入a[8],此时a[9]最大数。到此为止,10个数已按升序排好。

环变量j从i+1循环到9。


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
  int i, j, t, a[10];
  printf("请输人10个整数:");
  for (j = 0; j < 10; j++) {
  scanf("%d", &a[j]);
  }
  printf("\n");
  for (i = 0; i < 9; i++) {/* 外循环,循环9次*/
    for (j = i + 1; j < 10; j++) {/*内循环 */
    if (a[i] > a[j]) {//如果前面的数比后面的大
      t = a[i]; a[i] = a[j]; a[j] = t;/*交换位置*/
    }
    }
  }
  printf("排序之后:\n");
  for (j = 0; j < 10; j++) {
    printf("%4d",a[j]);
  }
  return 0;
}


结果:

319f319fa8f74396aa4542df3c19c6e0.png


2.直接法排序

直接法排序是选择排序的改进方法。例6.7的程序代码中,用于排序的双重循环中,每当a[i]>a[j]时,就交换 a[i]与a[j],实际上不需要每次都交换,只要增设一个变量k,用于记录每次较小数的下标,只需在本轮比较结束后,交换a[i]与a[k]即可

#include<stdio.h>
int main() {
  int i, j, t, a[10], k;
  printf("请输人10个整数:");
  for (j = 0; j < 10; j++) {
  scanf("%d", &a[j]);
  }
  printf("\n");
  for (i = 0; i < 9; i++) {/* 外循环,循环9次*/
  k = i;
  for (j = i + 1; j < 10; j++) {
    if (a[k] > a[j]) {
    k = j;//记录最小的数的下标
    }
  }
  if (i != k) {//这里是前面令k = i,如果交换了k就不等于i了 
    t = a[k], a[k] = a[i], a[i] = t;
  }
  }
  printf("排序之后:\n");
  for (j = 0; j < 10; j++) {
  printf("%4d",a[j]);
  }
  return 0;
}



结果:


cad560493bec48129c8c469769ba6f52.png


3.冒泡排序法

从键盘输入6个数据,存放到a[0]~a[5]的6个数组元素中。

①第1轮从a[0]到a[5]依次把两个相邻的元素两两比较,即a[0]与a[1]比,a[1]与a[2]比,.,a[4]与a[5]比。

每次相邻元素比较后,若顺序不对,则交换两个元素的值,否则不交换。假如数组a中a[0]~a[5]存放的6个数据如下:376524

从 a[0]到a[5]依次两两元素比较


结果:

d0771544a0f7440cb3932b3f7026119b.png


4.⼆分查找

include <stdio.h>
int main()
{
  int arr[] = {1,2,3,4,5,6,7,8,9,10};
  int left = 0;
  int right = sizeof(arr)/sizeof(arr[0])-1;
  int key = 7;//要找的数字
  int mid = 0;//记录中间元素的下标
  int find = 0;
  while(left<=right)
  {
    mid = (left+right)/2;
    if(arr[mid]>key)
    {
    right = mid-1;
    }
    else if(arr[mid] < key)
    {
    left = mid+1;
    }
    else
    {
    find = 1;
    break;
    }
 }
  if(1 == find )
  printf("找到了,下标是%d\n", mid);
  else
  printf("找不到\n");
}



相关文章
|
2月前
|
Java 索引
|
4月前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
2月前
数组元素同时查找插入
数组元素同时查找插入
25 0
|
7月前
|
算法 程序员 索引
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
63 0
|
算法
【算法专题突破】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(17)
【算法专题突破】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(17)
73 0
|
算法 C语言 C++
【二分查找】34. 在排序数组中查找元素的第一个和最后一个位置
二分查找是一种高效的查找算法,其时间复杂度为 O(log n)。在许多情况下,我们需要在一个有序数组中找到某个目标值的搜索范围。本文将介绍一种基于二分查找的搜索范围查找算法,该算法能够快速找到目标值在数组中的起始和结束位置。
81 0
单链表的按位查找和按值查找
单链表的按位查找和按值查找的代码实现讲解
445 0
|
Java
Java数组、排序和查找
Java数组、排序和查找
84 0