不成熟的c语言练习2

机缘

五味陈杂,这个月没咋写代码做项目,考研也应该是废了,准备把天赋带到考公和工作上,最近打算准备一下毕设和整理以前的课设。晚上玩完游戏练习了几个常用的基础排序算法,不知道以后的工作是否还能用上这些。


头文件

extern void InsertSort(int a[], int n);//插入排序
extern void ShellSort(int a[],int n);//希尔排序
extern void QuickSort(int a[],int low,int high);//快速排序
extern void BubbleSort(int a[],int n);//冒泡排序
extern void BubbleSort_c(int a[],int n);//双向交替冒泡排序

代码

void InsertSort(int a[], int n){
    int i,j=0;
    int temp=0;
    for(i=1;i<n;i++){
        if(a[i]<a[i-1]) {//判断是否需要排序
            temp = a[i];//临时储存当前要排序的数
            for (j = i - 1; (a[j]>temp)&&(j>=0); j--) {//如果不限定j>=0会在第一位需要挪动时产生错误
                a[j + 1] = a[j];//从后往前向后挪1位,直到找到比要排序的数要小的数
            }
            a[j + 1] = temp;//把要插入的数放在比这个数小的数后面
        }
    }

}
void ShellSort(int a[],int n){
    int j=0;
    for(int dk=n/2;dk>=1;dk=dk/2)//控制步长变化
        for(int i=dk;i<n;i++)//从下标dk遍历到下标n-1
            if(a[i]<a[i-dk]){//看这个元素是否需要和子表中上一个元素交换顺序,此元素比上一个元素小则需要把这个元素
                int temp=a[i];//temp暂存需要重排序的元素
                for(j=i-dk;j>=0&&temp<a[j];j-=dk)//把比temp小的子表元素在子表中后移
                    a[j+dk]=a[j];//j+dk就是i
                a[j+dk]=temp;//for中最后j-=dk,实际上此时temp值的位置在此时j+dk
            }
}
int Partition(int a[],int low,int high){//控制low和high两个下标,交替搜索比轴大的或比轴小的,比轴小的移动到low处,比轴大的移动到high处
    int pivot = a[low];//把当前表的第一个元素的值作为轴,这个轴会最终在low和high相等处出现
    while(low<high){//只有一个元素的时候就不执行了,即low==high时
        while(low<high&&a[high]>=pivot) high--;//用high从后往前搜索直到找到比轴小的,相等不动
        a[low]=a[high];//将那个比轴小的数放到low的那个位置去,相当于后移(局部不讲顺序)
        while(low<high&&a[high]<=pivot) low++;//用low从前往后搜索直到找到比轴大的,相等不动
        a[high]=a[low];//将那个比轴大的数放到high的那个位置去,相当于前移
    }
    a[low]=pivot;//low==high处是轴的位置
    return low;//返回轴的下标,完成了数组的划分,轴前面都是比轴小的,轴后面都是比轴大的
}
void QuickSort(int a[],int low,int high){
    if(low<high){//超过一个元素才有排序的必要,即最小子表只剩一个元素时局部排序完成,总体排序也完成
        int pivot = Partition(a,low,high);//对表进行划分
        QuickSort(a,low,pivot-1);//分别对两个子表进行排序,这是分治的思想
        QuickSort(a,pivot+1,high);
    }
}
void swap(int *a,int *b){//注意此处如果不是传入地址将无法进行实质上的交换
    int temp=*a;
    *a=*b;
    *b=temp;
}
void BubbleSort(int a[],int n){
    bool flag = false;//记录某一趟有没有发生交换
    for(int i=0;i<=n-1;i++){//冒泡排序从0干到n-1,一共n趟,每一趟把最大的元素放到最后
        flag = false;
        for(int j=0;j<=n-2-i;j++){//每一趟从前往后进行比较,不断交换把大的元素往后推,最大的元素会推到最后确定顺序
            if(a[j]>a[j+1]){//最后一位是n-1-i
                swap(&a[j],&a[j+1]);
                flag=true;
            }
        }
    if(flag == false) return;//如果某一趟没有发生交换则提前有序
    }
}

void BubbleSort_c(int a[],int n){//双向冒泡排序
    bool flag = false;//记录某一趟有没有发生交换
    int c=0;
    for(int i=0;i<=n-1;i++) {//冒泡排序从0干到n-1,一共n趟,每一趟把最大的元素放到最后
        flag = false;
        for (int j = 0; j <= n - 2 - i; j ++) {//奇数趟从前往后进行比较,不断交换把大的元素往后推,最大的元素会推到最后确定顺序
            if (a[j] > a[j + 1]) {//最后一位是n-1-i
                swap(&a[j], &a[j + 1]);
                flag = true;
            }
        }
        for (int j = n - 1 - i; j >= 1; j --) {//偶数趟每一趟从后往前进行比较,不断交换把小的元素往后推,最小的元素会推到最前边确定顺序
            if (a[j] < a[j - 1]) {//只要元素比前一个元素小就交换两元素位置
                swap(&a[j], &a[j - 1]);
                flag = true;
            }
        }
        if (flag == false) return;//如果某两趟没有发生交换则提前有序
    }
}//双向冒泡排序

憧憬

继续练习吧,又站在人生的转折点了,以后想多研究计算机视觉和嵌入式方向,可能以后工作并不对口,但是希望以后最少能以爱好继续学下去。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫方程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值