//myself test 插入排序类
#include<stdio.h>
//1.直接插入排序:(调试一次就成功啦!鼓励一下,当然是在自己确认过逻辑没错的情况下)
void InsertSort(int a[],int n){
int i=0,j=0;
for(i=1;i<n;i++){//数组元素个数从1~n.其中0号位置放置哨兵,共n+1个元素,被排序数为n个
if(a[i+1]<a[i]){
a[0]=a[i+1];
//for(j=i;j>0;j--){这一行错了,不应该用for循环,直到最后j为0,这样后移就不对。应该是当大于a[0]的时候就立刻退出,第二次这个错
j=i;//要变动的位置赋值给j
while(a[j]>a[0]){ //用到循环先考虑while循环
a[j+1]=a[j];
j--;
}
a[j+1]=a[0];
}
}
}
//2.希尔排序,又增量缩小排序。
//希尔排序是不稳定的,如 3 5 10 8 7 2 8 1 20 6
/*d=2 分成2组 (3 10 7 8 20) 和(5 8 2 1 6) 第一组的8在第二组的后面
排序后(3 7 8 10 20)和 (1 2 5 6 8) 现在是第一组的8在第二组前面了 这里不稳定 */
//搞半天原来是这个地方没有声明,直接把ShellSort提到前面了,逗
void Shell(int a[],int n,int d){//假设增量已定,其实就是增量已定的直接插入排序
int i=0,j=0;
for(i=d+1;i<n;i++){
if(a[i]<a[i-d]){//要非常注意很有可能不注意写成自减1
a[0]=a[i];
j=i-d;
while(j>=0 && a[j]>a[0]){ //要注意,为什么这里要检测j>=0,而直接插入排序不要
a[j+d]=a[j];//这个没错
//j--;这里居然一开始写成了j--,事实上这是不对的,应该每次减去d
j-=d;
}
//如果直到最前面一个菜插入,那么这个循环下来,j必定是负的,这一点需要注意
a[j+d]=a[0];
}
}
}
void ShellSort(int a[],int n){//这里的d是增量
int d=n/2;
while(d>=1){
Shell(a,n,d);
d=d/2;
}
}
void print(int a[],int n){
for(int i=1;i<n;i++){
printf("%d\t",a[i]);
}
printf("\n");
}
int main(){
int a[9]={0,3,1,5,7,2,4,9,6};
InsertSort(a,8);
print(a,8);
int b[9]={0,3,1,5,7,2,4,9,6};
ShellSort(b,9);
print(b,9);
getchar();
return 0;
}
插入排序类:直接插入排序和希尔排序
最新推荐文章于 2022-07-04 18:39:21 发布