失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 不成熟的c语言练习2

不成熟的c语言练习2

时间:2020-12-02 19:31:25

相关推荐

不成熟的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-1if(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就是ia[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-iswap(&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-iswap(&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;//如果某两趟没有发生交换则提前有序}}//双向冒泡排序

憧憬

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

如果觉得《不成熟的c语言练习2》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。