上篇讲了一些数组的基本用法
没错这次继续讲这个,学不明白了我
我记得我们在大学计算机上讲了用python来实现冒泡、选择排序和二分法查找,天下代码一家亲,如何用c来实现呢
首先about冒泡排序
用一张动图来说就是 (不知道能不能动哈,其实就是一个数一个数浮上去)
我们上回就搞了这么道题
我的做法就是增大数组长度将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;
}
}
}
这个代码就是将数据进行两两比较大数 “冒泡”过程,整个过程就是这样:
乘这股劲,我们来看看这道巨坑的题(我一直以为我没排对,没想到他就这样要求)
哪有人要求把这个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-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个元素的整形数组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");
}
那个......好像可以再见了
拜拜