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; }
以下是分析过程
二分查找的代码:
/** 二分查找:加强理解记忆 */ #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; }
这一整个分析过程下来,感觉有助于提高自己的思考!!很美好