C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆)

C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆)

    虽然直接插入排序,冒泡排序以及二分查找是算法中最为基础以及老掉牙的话题,但作为一名算法的深爱者,有时候无聊时候总会将这些简单的话题重新理解并敲写一番,目的只是为了得到理解娴熟的程度。而且,我觉得越是简单基础的东西,有时候更应该反复的去敲写,深化它,并最终让其中的思想内化为自己的一部分。待到他日一提起之时,会相当娴熟的“刷刷刷。。。”几分钟搞定,那就很有成就感了!

    因为我喜欢对于一个问题进行实例的剖析,进而再转化为特有的用某种数学式子或者算法符号来表达,然后再附上一部分的算法伪代码,最终再“哒哒哒。。。”敲上自己的”艺术杰作“。而在这一过程,我喜欢在纸上思绪腾飞般胡乱描绘我的思路。。。

    首先是直接插入排序

    以下是自己的分析过程以及实例解析


    


    对应的代码:


/**
直接插入排序:加强理解记忆
*/

#include <stdio.h>

#define N 7

void DInsertSort(int* arr,int n)
{
	int i,temp,pos,k;
	//从第二个元素开始
	for (i=1;i<n;i++)
	{
		temp=arr[i];
		pos=i;
		k=i-1;
		while (k>=0 && temp<arr[k])
		{
			k -= 1;
		}
		//终于跳出while循环----有两种情况:k<0  或者  temp>=arr[k]   不管哪种情况,以下都适合
		k += 1;
		//往后搬迁元素
		while (pos>k)
		{
			arr[pos] = arr[pos-1];
			pos -= 1;
		}
		//搬迁完毕,回填元素
		arr[pos]=temp;

	}
}


int main()
{
	//int R[N]={0,2,3,1,5,7,0};
	int R[N]={-1,-3,-5,-9,0,1,0};
	printf("数组原先的元素: ");
	for (int i=0;i<N;i++)
	{
		printf("%d ",R[i]);
	}
	printf("\n");

	
	DInsertSort(R,N);


	printf("直接插入排序后数组的元素: ");
	for (int j=0;j<N;j++)
	{
		printf("%d ",R[j]);
	}
	printf("\n");

	return 0;
}
    运行结果:


    接着是冒泡排序:这一老掉牙的算法在这里提供两种实现方式--一种是传统的两两比较作交换,一种是加上一个change作为在一次比较中发现后续元素是否有序。

    

    代码如下:

/**
冒泡排序:加强对其的理解
*/

#include <STDIO.H>

#define N 7

//传统的冒泡排序
void BubbleSortOne(int* arr,int n,int& count)
{
	int temp;
	for (int j=0;j<n-1;j++)
	{
		for (int i=0;i<n-j-1;i++)
		{
			if (arr[i]>arr[i+1])
			{
				temp=arr[i];
				arr[i]=arr[i+1];
				arr[i+1]=temp;

				count += 1;
			}
		}
	}

}

//加上change标志的冒泡排序
void BubbleSortTwo(int* arr,int n,int& count)
{
	bool change=true;
	int temp;
	for (int j=0;j<n-1&&change;j++)
	{
		change=false;
		for (int i=0;i<n-j-1;i++)
		{
			if (arr[i]>arr[i+1])
			{
				temp=arr[i];
				arr[i]=arr[i+1];
				arr[i+1]=temp;

				change=true;

				count += 1;
			}
		}
	
	}
}


int main()
{
	//int R[N]={2,4,1,0,0,2,5};
	int R[N]={1,0,2,0,7,3,5};
	printf("原先数组的元素: ");
	for (int i=0;i<N;i++)
	{
		printf("%d ",R[i]);
	}
	printf("\n");

	int count=0;

	BubbleSortOne(R,N,count);

	//BubbleSortTwo(R,N,count);


	printf("交换的次数: %d\n",count);

	printf("冒泡排序之后数组的元素: ");
	for (int j=0;j<N;j++)
	{
		printf("%d ",R[j]);
	}
	printf("\n");

	return 0;
}

    最后是二分查找:在这里需要注意的是---1.二分查找需要查找的序列已经有序 2.在找到元素之后要跳出查找的循环。

    以下是分析过程


   二分查找的代码:


/**
二分查找:加强理解记忆
*/

#include <stdio.h>

#define N 7

/*找到即返回元素在数组中的物理位置,找不到则返回-1*/
int BinarySearch(int* arr,int n,int se)
{
	int low=0,high=n-1;
	int mid=0,pos=-1;
	while (low<=high)
	{
		mid=(low+high)/2;
		if (se>arr[mid])
		{
			low=mid+1;
		}
		else if (se<arr[mid])
		{
			high=mid-1;
		}
		else
		{
			//return mid;
			pos=mid;
			break;
			//差点忘记break掉;  ---或者此处直接return回去:return pos也可以---只是觉得这样子写不规范
		}
	}
	if (pos!=-1)
	{
		return pos;
	}
	else
	{
		return -1;
	}
	
}

int main()
{
	int arr[N]={0,1,2,4,5,6,8};
	printf("数组中的元素: ");
	for (int i=0;i<N;i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");

	int val=8;
	//int val=-9;

	//printf("%d",BinarySearch(arr,N,val));
	int pos=BinarySearch(arr,N,val);
	if (pos != -1)
	{
		printf("元素%d是数组中第%d元素\n",val,pos+1);
	}
	else
	{
		printf("元素%d不存在与该数组中\n",val);
	}

	return 0;
}


    运行结果:



    这一整个分析过程下来,感觉有助于提高自己的思考!!很美好


评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

修罗debug

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

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

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

打赏作者

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

抵扣说明:

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

余额充值