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

来源:互联网 发布:网络发短信不显示号码 编辑:程序博客网 时间:2024/06/04 21:11

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

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

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

    首先是直接插入排序

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


    


    对应的代码:

/**直接插入排序:加强理解记忆*/#include <stdio.h>#define N 7void 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;}

    运行结果:



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


1 0
原创粉丝点击