c语言学习之排列 插序法和冒泡法还有二分法

一.选择排序

部分核心代码

for (i = 0; i < len-1; ++i) //控制位置 
	{
		for (j = i + 1; j < len; ++j)//找数
		{
			if (a[j] < a[i])
			{
				int t = a[i];
				a[i] = a[j];
				a[j] = t;
			}
		}
	}

数组是a[i],len是数组长度;

用数组a[1,3,2,5,4]作为例子,当i=0时,a[i]=a[0]=1和后面的4个数比较,即循环a[j];当遇到比a[i]小的数时,就做数值交换;当i=4,即a[i]=a[4]=5时,a[i]就和最后一位数a[j]进行最后的比较,所以i的范围是i<len-1,j<len

二.插入排序

1.非原地插入排序

int b[len];
	for (i = 0; i < len; ++i)
	{
		int t = a[i];
		j = i;

		while(j > 0 && t < b[j-1])
		{
			b[j] = b[j-1];
			--j;
		}

		b[j] = t;
	}

用数组a[1,3,2,5,4]作为例子,b[ ]为空数组,用t来作为交换值。当i=0时,不满足while(j>0)的条件,直接将a[0]记入数组b[0]。当i=1时,t=a[i]=a[1],用t=a[1]来和前1位的数b[j-1]=b[0]做比较,把大的数记录在b[j],t=a[i]继续和前面的数比较,直到与第一个完成比较即j=0时,退出while循环,b[j]即循环结束时的位置b[j]=t

2.原地插入

思想:
        在有序序列中,找到合适的位置插入

for (i = 1; i < len; ++i)
	{
		int t = a[i];
		j = i;

		while(j > 0 && t < a[j-1])
		{
			a[j] = a[j-1];
			--j;
		}
		a[j] = t;
	}
	

三、 二分查找

思想:
        1. 找到中间位置的数, //下标 
        2. 拿这个数 和 要找的数比较 

        mid 是数组下标    
        a[mid] > m 
        a[mid] < m
        3. 每次折一半,直到找到对应数组,或者 结束

前提:数据得是有序的

部分核心代码:

int begin,mid,end;
	begin = 0;
	end = len-1;

	while (begin <= end)
	{
		mid = (begin+end)/2;

		if (a[mid] > m)
		{
			end = mid - 1;
		}else if (a[mid] < m)
		{
			begin = mid + 1;
		}else 
		{
			break;
		}
	}

	if (begin <= end)
	{
		printf("found!\n");
	}else 
	{
		printf("not found!\n");
	}

首先定义数组的开始begin=0,数组的末尾end=len-1,从键盘输入一个数m

当while (begin <= end),mid=(begin+end)/2,此时的中间值就是a[mid]。当a[mid]>m说明m在该数组的前半段,用end=mid-1表示前半段的一半,取前半段的一半和m进行比较,直到a[mid]=m或end<begin时,用break将整个while停止;

最后的if (begin <= end),else{}表示:while如果提前结束就说明找到了,没提前结束一直到begin>end就说明没找到;

四.冒泡排序

思想:
       一次冒出一个数 
       相邻两个元素,两两比较,小的放前,大的放后

for (i = len-1; i > 0; --i)
	{
		for(j = 0; j < i; ++j)
		{
			if (a[j] > a[j+1])
			{
				int t = a[j];
				a[j] = a[j+1];
				a[j+1] = t;
			}

		}
	}

分析:例如数组a[1,3,2,6,5];len=5

i从i=4开始循环,a[j] > a[j+1],如果第一个比第二个大(升序排序中),就交换它们两个。

从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。然后i循环即i=3,本次循环结束时,倒数第二个数会是第二大的数。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

五.一维字符型数组

一维字符型数组 --- 放字符串 

  1.字符串 是 当做字符数组来处理的。
  2.字符串 有一个专门的结束标志 '\0'
  3.处理的是字符串,操作的时候,往往以 结束标志 为 操作依据 
  4.处理的是数组,操作的时候,往往以 数组长度 作为操作依据 
  5.字符数组可以用来存储字符串 
    而字符串在内存中存储的方式 也是以 字符数组形式存储的 

字符串:char s[ ]="hello" 
               实际占用的内存空间,是'h''e''l''l''o''\0'       包含了'\0'   

int puts(const char *s);
     功能:输出一个字符串 
     参数:
         s   //表示字符串 -- 指针类型 
             //字符数组名 s
             //字符串常量 "hello"
    返回值:
          成功 非负数 
          失败 -1 
    注意:puts输出时 自动会加 换行

使用gets(),容易越界,占用别的空间,属于危险操作。

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值