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+5;
int a[maxn];
int b[maxn];
//这种方法固定可知方便 有利于以后长串的代码
多了一个bool类型
使用方法:
bool a;
a=false;//(bool是一个字节,而之前int来表示正负来完成bool的功能要4位,也即是32个字节)
多了一个构造函数(在类中)
排序
归并排序
归并排序一共分两种步骤
- 将要排序的数列一次又一次进行对半分的操作(直到分解成一个单位)
- 将俩个一个单位进行有序组合,然后组合好的这两个单位成为一个新的整体,和另外一个相邻的另一个整体进行了有序排列,然后这四个数字形成的有序数列
又成为了一个新的整体…
以此类推 最后再进行有序的合并。
代码实现:
#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】进行上述操作,直到最后分前后只有三个数。
像一个挖坑游戏:
- 随意选择一个中间值a[0](一般选择第一个)设置为X,那么这个中间值就被我们提取到了X上面,随之在原本放在a[0]的位置空出来了
- 那么我们就要从后往前找到一个比X大的数将它放到那个坑上,这样虽然X空出来的位置被填满,但是又有一个新的坑出现
- 这次我们从前往后找到一个比X小的数填到后面的坑
- 周而复始,直到一个交点,从前找不到比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;
}