C语言学习笔记-数组(2)


上篇讲了一些数组的基本用法

没错这次继续讲这个,学不明白了我

我记得我们在大学计算机上讲了用python来实现冒泡、选择排序和二分法查找,天下代码一家亲,如何用c来实现呢

首先about冒泡排序

冒泡排序( Bubble Sort )又称为泡式排序,是一种简单的排序算法
重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成
这个 算法的名字由来是因为越 (大) 元素会经由交换慢慢“浮”到数列的顶端。

用一张动图来说就是 (不知道能不能动哈,其实就是一个数一个数浮上去)

 我们上回就搞了这么道题

 

 我的做法就是增大数组长度将X插进去之后进行冒泡排序

#include<stdio.h>
int main(void)
{
   int N,X,i,t,j;
   scanf("%d",&N);
   int a[N];
   for(i=0;i<N;i++)
   {
       scanf("%d",&a[i]);
   }
   scanf("%d",&X);
   N+=1;
   a[N-1]=X;
   for(i=0;i<N;i++)
   {
        for(j=0;j<N-i-1;j++)
        {
            if(a[j]>a[j+1])
            {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            
			}
		} 
    }
    for(i=0;i<N;i++)
    printf("%d ",a[i]);
} 

其中

 for(i=0;i<N;i++)
   {
        for(j=0;j<N-i-1;j++)
        {
            if(a[j]>a[j+1])//大数上浮
            {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            
            }
        } 
    }

这个代码就是将数据进行两两比较大数 “冒泡”过程,整个过程就是这样:

1. 比较相邻的元素。如果第一个比第二个大,就交换它们两个。
2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3. 针对所有的元素重复以上的步骤,除了最后一个。
4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

乘这股劲,我们来看看这道巨坑的题(我一直以为我没排对,没想到他就这样要求)

 

哪有人要求把这个5排在中间的

#include<stdio.h>
int main(void)
{
	int N, min, max, index1, index2, t;
	scanf("%d",&N);
	int a[10];
	int i, j;
	for(i=0;i<N;i++)
	{
		scanf("%d",&a[i]);
	}
	min=a[0];
	max=a[N-1];
	for(j=1;j<N;j++)
	{
		if(min>a[j])
		{
			min=a[j];
			index1=j;
		}
	}
	if(index1!=0)
	{
		t=a[0];
		a[0]=a[index1];
		a[index1]=t;
	}
	for(j=1;j<N;j++)
	{
		if(max<a[j])
		{
			max=a[j];
			index2=j;
		}
	}
	if(index2!=N-1)
	{
		t=a[N-1];
		a[N-1]=a[index2];
		a[index2]=t;
    }
	int k;
	for(k=0;k<N;k++)
	{
		printf("%d ",a[k]);
	}
	return 0;
 } 

ps:记得大值和小值要分开比较


然后我们来看看选择排序

选择 排序   n 个元素  从小到大
重复扫描要排序的数据,找到未排序数据中最小的元素,然后将其交换到未排序数据的 最前面。
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始 位置
然后 ,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾
以此类推 ,直到所有元素均排序完毕。

这里也放一张不知道能不能动的动图

怎么说呢,选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多 n-1次交换。 //虽然说他好像跟冒泡比较次数差不多

不管了,来看看输入n,再输入n个整数,用选择法将它们从小到大排序后输出。

首先呢 

 

 

 这样一来可以得到它的源程序段

for(k = 0; k < n-1; k++)
{   
        index = k;
        for(i = k + 1; i < n; i++)
        {  
            if(a[i] < a[index])
            {
                 index = i;   
            }
        } 

        temp = a[index]; 
        a[index] = a[k]; 
        a[k] = temp;
}   

最后我们来讲二分法:

二分查找
常用的二分查找是一个典型的分治算法   
二分查找基本原理:用于在n个元素的有序序列中查找指定元素e。将n个元素分成个数大致相同的两半,取an/2与欲查找的e作比较:
若e=an/2,则找到e,算法终止
若e<an/2,则只需在数组a的前半部分继续二分查找e
若e>an/2,则只需在数组a的后半部分继续二分查找e
(二分查找每次比较将数据减少一半,也称折半查找。)

 

上手实操: 

 设已有一个n个元素的整形数组a,且按值从小到大有序排列。输入一个整数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出“Not Found”

low = 0; 
high = n - 1;                     /* 开始时查找区间为整个数组 */
while  ( low <= high )  
{     	/* 循环条件 */
    mid = (low + high) / 2;         	/* 中间位置 */
    if ( x == a[mid] )
    {
         break;                               	/* 查找成功,中止循环 */
    }
    else if ( x < a[mid] )
    {
         high = mid - 1;      /* 新查找区间为前半段,high前移 */
    }
    else
    {       
         low = mid + 1;       /* 新查找区间为后半段,low后移 */
    }
}    
if ( low <= high )
{ 
    printf("Index is %d \n", mid);
}
else
{ 
    printf( "Not Found\n");
}

那个......好像可以再见了

拜拜

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ryan-%

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值