一.发博客的目的
发博文是为了学习交流,一方面是督促自己学习,掌握编程知识,另一方面希望结交志同道合的朋友,让大家更高效更轻松地理解编程,后续如果粉丝超过一定数量会建群,方便大家答疑和交流!!!
二.会更新那些内容
偏底层编程语言系列,包括汇编,C语言,c++等,数据结构与算法系列,单片机系列,以及计算机专业基础课系列,包括计算机组成原理,操作系统,计算机网络等等
三.编程工具
新手推荐devc++5.11,它使用比较简单,功能丰富,最重要的是占用内存小,如果你的电脑带不动大型软件,完全可以用这款软件平替,对于有一定基础的,咱这里推荐Visual Stdio2015,你也可以下载其他版本
四.零基础学算法
这里说的零基础学算法,并不是说你什么都不知道也能学会,你至少有一定的编程基础,因为咱们学算法的目的是更好的利用计算机里面有限的资源,达到优化代码的目的,学习算法如果没有利用代码解决问题的能力,就相当于没学一样,所以,这里提醒一点,一定要自己敲代码!!!当你能不看示例代码随手写出算法的时候,你才算真正学会!
五.十大排序算法(数组实现)
1.冒泡排序(又称起泡排序),是一种十分常见的算法,它的原理比较简单,但是缺点就是比较‘暴力’,而且时间复杂度较高,适用于比较有序的序列,原理是通过相邻元素的不断比较,在每一趟比较后,找到这些相比较的元素的最大值,然后减少每趟元素的比较次数。案例:定义一个整形数组,arr[]={8,2,4,7,1,6,5,3,9},实现升序排序。
#include <stdio.h>
#include <stdlib.h>
//冒泡排序
void bubble_sort(int arr[],int num)
{
for(int i=0;i<num-1;i++)//比较趟数
for(int j=0;j<num-1-i;j++)//每趟比较次数
{
//升序
if(arr[j]>arr[j+1])
{
int tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
//验证
for(int i=0;i<num;i++)
printf("%d ",arr[i]);
printf("\n");
}
int main()
{
int arr[]={8,2,4,7,1,6,5,3,9};
bubble_sort(arr,sizeof(arr)/sizeof(int));
return 0;
}
2.快速排序,是一种不断简化问题的算法,即对一个复杂的问题,相对于冒泡排序的时间复杂度较低,排序思想是将一个复杂问题问题分解成许多子问题,其中子问题处理问题的方式和原问题一样,这种处理问题的思想我们称为分治,分解问题的方式我们称之为递归。排序的具体操作是:对于一个数组,0号位置作哨兵(用于存放当前中心点位置的元素,不参与排序),默认将low作为当前中心点位置,比l中心点位置大的元素,从high开始往前存放,程序设计时,我们将high的位置元素赋值给low,我们就认为high “空了”,这时我们再从前找比中心点元素大的元素,依次往后存放,当low位置元素赋值给high位置时,我们认为low “空了”,一直这样操作直至low与high重合,我们将哨兵位置元素还给low或high,这是所有子问题的操作方法,再合并起来,就能实现排序。案例:定义一个整形数组,arr[]={0,8,2,4,4,1,6,5,3,9},实现升序排序。
#include <stdio.h>
#include <stdlib.h>
int partition(int arr[],int low,int high)
{
//每次开始找中心点前默认low位置为当前中心点
arr[0]=arr[low];
int pivotkey=arr[low];
while(low<high)
{
//从后找比中心点小的元素放到low位置
while(low<high&&arr[high]>pivotkey)
high--;
arr[low]=arr[high];
//从前找比中心点大的元素放到high位置
while(low<high&&arr[low]<pivotkey)
low++;
arr[high]=arr[low];
}
//更新中心点
arr[low]=pivotkey;
return low;
}
void quick_sort(int arr[],int low,int high)
{
if(low<high)
{
int pivotloc=partition(arr,low,high);//找中心点
quick_sort(arr,low,pivotloc-1);//左子表递归
quick_sort(arr,pivotloc+1,high);//右子表递归
}
}
int main()
{
int arr[]={0,8,2,4,7,1,6,5,3,9};//arr[0]放哨兵 不参与排序
quick_sort(arr,1,9);
//验证
for(int i=1;i<sizeof(arr)/sizeof(int);i++)
printf("%d ",arr[i]);
printf("\n");
return 0;
}
六.结语
6.1本期疑问
1.两种交换排序如何修改代码实现降序排序?
2.快速排序去掉哨兵的代码怎么修改?
6.2视频和书籍学习
视频的话这里推荐青岛大学王卓老师的数据结构与算法
https://space.bilibili.com/40323036?spm_id_from=333.337.0.0
书籍推荐严蔚敏老师的《数据结构-C语言版》,如果还想深入学习算法,可以看《算法导论》
本期的内容到这就结束了,如果有任何问题或者博客中出现任何错误,欢迎在评论区留言艾特我。