第二周周任务总结

c++和c语言的区别

结构体构造的方式发生了变化

原本c语言构造一个结构体是这样的:

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} ;
struct books book;

想要和c++一样方便:

typedef struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
}sbook;//这里不是定义一个新的结构体变量,而是命名一个新的名字
sbook book;

而在c++中他变成了这样

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} ;
books book;//会发现定义books的结构体变量不需要再使用struct

同时在c++中typedef也基本没什么用了

定义一个数组

const int maxn =1e6+5int a[maxn];
int b[maxn];
//这种方法固定可知方便 有利于以后长串的代码

多了一个bool类型

使用方法:

bool a;
a=false//(bool是一个字节,而之前int来表示正负来完成bool的功能要4位,也即是32个字节)

多了一个构造函数(在类中)

排序

归并排序

归并排序一共分两种步骤

  1. 将要排序的数列一次又一次进行对半分的操作(直到分解成一个单位)
  2. 将俩个一个单位进行有序组合,然后组合好的这两个单位成为一个新的整体,和另外一个相邻的另一个整体进行了有序排列,然后这四个数字形成的有序数列
    又成为了一个新的整体…
    以此类推 最后再进行有序的合并。

代码实现:

#include<stdio.h>
void merge_array(int *a,int first, int middle, int last , int *temp)//进行有序的合并
{
	int i=first,j=middle+1;
	int k=0;
	while(i<=middle&&j<=last)
	{	
		if(a[i]<a[j])
			temp[k++]=a[i++];
		else 
			temp[k++]=a[j++];
	}
	while(i<=middle)
		temp[k++]=a[i++];
	while(j<=last)
		temp[k++]=a[j++];
	for(i=0;i<k;i++)
		a[first+i]=temp[i];//重新赋给a数组时,是从first开始的。
}
void merge_sort(int *a, int first, int last,int *temp)//将数组进行拆分,同时通过merge_array来进行有序的组合
{
	if(first<last)
	{
		int middle=(first+last)/2;
		merge_sort(a,first,middle,temp);
		merge_sort(a,middle+1,last,temp);
		merge_array(a, first, middle, last, temp);//这个函数千万要放最后这样最后的排序才能是对的
	}
}

//以下为自行设计的样例
int main()
{
	int i;
	int a[10]={1,6,9,5,8,2,7,41,9};
	int temp[11];
	merge_sort(a,0,8,temp);
	for(i=0;i<9;i++)
		printf("%d ",a[i]);
	return 0;
}

快速排序

快速排序(这里假设有n个数)就是通过一次次选择中间值a【x】,将比a【x】大的数放到前面,小的数放到后面,然后分流用递归,从a【0】~ a【x-1】和a【x+1】~ a【n-1】进行上述操作,直到最后分前后只有三个数。

像一个挖坑游戏:

  1. 随意选择一个中间值a[0](一般选择第一个)设置为X,那么这个中间值就被我们提取到了X上面,随之在原本放在a[0]的位置空出来了
  2. 那么我们就要从后往前找到一个比X大的数将它放到那个坑上,这样虽然X空出来的位置被填满,但是又有一个新的坑出现
  3. 这次我们从前往后找到一个比X小的数填到后面的坑
  4. 周而复始,直到一个交点,从前找不到比X小的数,从后面也找不到比X大的数,那么那个交点就可以把X也就是原本的a【0】填进去
    代码实现:
#include<stdio.h>
#include<math.h>
void quick_sort (int *a,int l,int r)
{
	
	if(l<r)//这个很重要,当元素只有两个时候左边界是l,右边界是r,而 此时i=j=l,那么下次循环如果没有这个条件就会无限调用
	{
	int x=a[l];
	int i=l,j=r;	
		while(i<j)
		{
			while(i<j&&a[j]<x)
			j--;
			if(i<j)
			a[i++]=a[j];
			while(i<j&&a[i]>=x)
			i++;
			if(i<j)
			a[j--]=a[i];		
		}	
	a[i]=x;//第一次没有将原本的数字再次填进去导致错误
	quick_sort(a,l,i-1);//
	quick_sort(a,i+1,r);//这两个调用函数要放在括号里面,不然没有终止条件,只会无限制调用下去
	}
 } 
 //
 //以下为自测样例
 int main ()
{
	int i;
	int a[6]={1,9,7,9,3,5};
	quick_sort(a,0,5);
	for(i=0;i<6;i++)
		printf("%d ",a[i]);
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值