第十一章看完了,课后题还没写(;´д`)ゞ
快开学了,不知道是不是应该把重心转移到别处?
十一章之后的东西不知道短时间内能不能用上。
今天又看了两个排序算法
直接插入排序
/*insertsort直接插入排序
*每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止*/
#include<stdio.h>
void insertsort(int arr[],int n);
int main(void)
{
int i,array[20]={21,25,49,25,16,8,9,1,4,22,8548,453,215,4452,21,12,5,4,20,453};
insertsort(array,20);
printf("\n* **\t* **\t* **\t* **\t* **\t* **\t* **\t* **\t* **\n");
for(i=0;i<20;i++){
printf("%d ",array[i]);
}
return 0;
}
void insertsort(int arr[],int n)//数组有n个元素
{
int i,j,temp;
for(i=1;i<n;i++){
temp=arr[i];//复制出元素arr[i],之前元素已经排好序
for(j=i;j>0&&temp<arr[j-1];j--){//将抽取的元素与之前的有序数列进行比较
//若存在temp<arr[i]前的元素,arr[i]的位置空出
arr[j]=arr[j-1];//当temp小于比较项时,大于temp的部分后移一个单位,最终arr[j]空出
}//不写temp=<arr[j-1]可以减少循环,还保证了排序的稳定性o(*▽*)o
arr[j]=temp;//若arr[i]>之前所有元素,则跳出上面循环(还是运算了j=i)
}
for(i=0;i<n;i++){
printf("%d ",arr[i]);
}
}
选择排序
/*选择排序——不稳定*/
/*给每个位置选择当前元素最小的,比如:
*给第一个位置选择最小的,在剩余元素里面给第二个元素选择最小的,依次类推,直到第n-1个元素。
*第n个元素不用选择了,因为只剩下它一个最大的元素了*/
#include<stdio.h>
void selectsort(int arr[],int n);
int main(void)
{
int i,array[20]={21,25,49,25,16,8,9,1,4,22,8548,453,215,4452,21,12,5,4,20,453};
for(i=0;i<20;i++){
printf("%d ",array[i]);
}
printf("\n");
for(i=0;i<10;i++)
printf("**\t");
printf("\n");
selectsort(array,20);
for(i=0;i<20;i++){
printf("%d ",array[i]);
}
return 0;
}
void selectsort(int arr[],int n)
{
int i,j,k,temp,min;
for(i=0;i<n;i++){//当前在处理第i个元素
min=arr[i];
k=i;//别忘了这个语句,不然最后一轮会出岔子
for(j=i+1;j<n;j++){//min记录这一轮最小的数值,k为最小数值所在位置
if(arr[j]<min){//
min=arr[j];
k=j;
}
}
if(i!=k){//交换arr[i]与arr[k]的数值
temp=arr[k];
arr[k]=arr[i];
arr[i]=temp;
}//可能使得原顺序被打乱,是不稳定的排序,例如:5 8 5 2 9
}
}
参考博客在此,不过总感觉在别的地方见过……
也许该到OJ上水题找找手感了……
2019年2月13日23点28分