0基础入门数据结构与算法之-十大排序算法第一篇(C语言版)

一.发博客的目的

发博文是为了学习交流,一方面是督促自己学习,掌握编程知识,另一方面希望结交志同道合的朋友,让大家更高效更轻松地理解编程,后续如果粉丝超过一定数量会建群,方便大家答疑和交流!!!

二.会更新那些内容

偏底层编程语言系列,包括汇编,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语言版》,如果还想深入学习算法,可以看《算法导论》 

                                                    

本期的内容到这就结束了,如果有任何问题或者博客中出现任何错误,欢迎在评论区留言艾特我。

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值