您的位置:首页 > 编程语言 > C语言/C++

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

2015-08-18 21:25 791 查看
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
={0,2,3,1,5,7,0};
int R
={-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
={2,4,1,0,0,2,5};
int R
={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
={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;
}


总结:这一整个分析过程下来,感觉有助于提高自己的思考!!很美好
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息