![](https://img-blog.csdnimg.cn/2020083113062930.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法(C语言)
数据结构与算法是计算机专业的基础。。。。
一溢孤行
这个作者很懒,什么都没留下…
展开
-
二分查找二(二分查找的经典变形问题)
一、查找第一个值等于给定值的元素主要代码:int bsearch1(int* a, int n, int value){ int low = 0; int high = n - 1; while (low <= high) { int mid = low + ((high - low) >> 1); if (a[mid] < value) { low = mid + 1; } else if (a[mid] > value) {原创 2020-08-31 22:51:42 · 195 阅读 · 1 评论 -
二分查找一(简单的递归与非递归实现)
#include<stdio.h>#define N 1000// 二分查找的循环实现int Binary_search1(int *a, int n, int value){ int low = 0; // 定义开始下标 int high = n - 1; // 定义末尾下标 while (low <= high) // 注意循环退出条件是low <= high,不是low < high { int mid = (low + high) / 2原创 2020-08-31 12:11:36 · 215 阅读 · 0 评论 -
排序二(归并、快排)
一、归并排序归并排序的核心思想:如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起。归并排序使用的是分治思想,即将一个大问题分解成小的子问题来解决。因此,这里我们用递归代码来实现归并排序。归并排序递推公式:merge_sort(p…r) = merge(merge_sort(p…q), merge_sort(q+1…r))终止条件:p >= r 不用再继续分解merge_sort(p…r) 表示,给下标从 p 到 r 之间原创 2020-08-29 11:10:18 · 481 阅读 · 0 评论 -
排序一(冒泡、插入、选择)
#include<stdio.h>#include<stdlib.h>#include<stdbool.h>// 冒泡排序// 最好情况时间复杂度:O(n)// 最坏情况时间复杂度:O(n^2)// 平均情况时间复杂度:O(n^2)// 空间复杂度:O(1)void bubblesort(int a[], int n){ if (n <= 1) return; for (int i = 0; i < n; ++i) { // 提原创 2020-08-28 16:37:34 · 534 阅读 · 0 评论 -
队列(基于数组实现和链表实现)和循环队列
一、基于数组实现的队列#include<stdio.h>#include<stdlib.h>#define size 10 // 宏定义一个大小为10的队列// 基于数组实现的队列称为顺序队列// 定义一个队列的数组结构体typedef struct queue{ int data[size]; // 利用数组实现队列元素的定位 int head; // 队头下标 int tail; // 队尾下标}Array_queue;// 建立一个空队列.原创 2020-08-28 13:30:17 · 371 阅读 · 0 评论 -
栈(基于数组实现和链表实现)
一、基于数组实现的顺序栈#include<stdio.h>#include<stdlib.h>#define maxsize 100//栈的数组结构体typedef struct Stack{ char data[maxsize]; // 数组实现栈内元素定位 int top; // 作为数组下标 int buttom;}Array_Stack;// 创建一个空栈Array_Stack* Create_Stack(){ Array_Stack* st原创 2020-08-28 11:56:01 · 372 阅读 · 0 评论 -
单链表(支持增、删、反转)
#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct D_LinkList{ int val; struct D_LinkList* next;}LNode;LNode* Create(){ LNode* p = (LNode*)malloc(sizeof(LNode)); if (p == NULL) { printf("malloc error!\n");原创 2020-08-28 11:27:36 · 126 阅读 · 0 评论 -
数组
一、数组是什么?数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。线性表结构包括数组、链表、队列、栈等数据结构。非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简单的前后关系。关于线性表和非线性表的其他数据结构类型我将会在后续的笔记中逐一介绍二、如何随机访问数组元素?正是因为数组是连续的内存空间和相同类型的数据,基于数组的这两个限制,原创 2020-08-08 15:40:02 · 395 阅读 · 0 评论 -
复杂度分析(下)
一、最好、最坏情况时间复杂度先来看一段代码:// n表示数组array的长度int find(int[] array, int n, int x) { int i = 0; int pos = -1; for (; i < n; ++i) { if (array[i] == x) pos = i; } return pos;}很显然按照上一个笔记《复杂度分析(上)》中的分析方法,我们可以看出这段代码的复杂度为O(n), n代表数组长度。然而,这段代码并不高效,原创 2020-08-07 16:37:33 · 109 阅读 · 0 评论 -
复杂度分析(上)
复杂度分析(上)一、什么是复杂度分析?1.数据结构与算法解决的是“如何让计算机更快,更省时间、更省空间地解决问题”,所以执行效率是算法一个非常重要的考量指标。2.因此需从代码执行时间和占用空间两个维度来评估数据结构与算法的性能。3.我们分别用时间复杂度和空间复杂度这两个性能来描述性能问题,二者统称为复杂度。二、为什么要进行复杂度的分析?1.与在真实的编译环境进行测试相比,复杂度分析具有成本低、效率高、操作简单、指导性强等优点。2.掌握复杂度的分析,将有助于我们编写出性能更优的代码,有利于原创 2020-08-06 15:39:07 · 336 阅读 · 1 评论