![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
wxhdmf
这个作者很懒,什么都没留下…
展开
-
线性表之链式存储结构
线性表之链式存储结构线性表的顺序存储结构要求逻辑关系上相邻的元素在物理位置上也相邻,这样方便了随机存取,但是在插入和删除元素时,需要移动大量元素,而线性表的链式存储则不要求逻辑上相邻的元素在物理位置上也相邻,因此它没有顺序存储结构的可随机存取的优点,不过在插入和删除元素时比较方便。单链表单链表可由头指针唯一确定,在C语言中可用“结构指针”来描述: 1: ty转载 2014-06-08 10:14:24 · 471 阅读 · 0 评论 -
如何判断一个非负整数是否是2的幂
如何判断一个非负整数是否是2的幂如何判断一个数是2的幂,主要是要找出2的幂次方的数的特点。我们知道,1个数乘以2就是将该数左移1位,而2的0次幂为1, 所以2的n次幂(就是2的0次幂n次乘以2)就是将1左移n位, 这样我们知道如果一个数n是2的幂,则其只有首位为1,其后若干个0,必然有n & (n - 1)为0。(在求1个数的二进制表示中1的个数的时候说过,n&(n-1)去转载 2014-06-08 09:58:17 · 468 阅读 · 0 评论 -
冒泡排序
冒泡排序冒泡排序是最基本的排序算法之一,其核心思想是从后向前遍历数组,比较a[i]和a[i-1],如果a[i]比a[i-1]小,则将两者交换。这样一次遍历之后,最小的元素位于数组最前,再对除最小元素外的子数组进行遍历。进行n次(n数组元素个数)遍历后即排好序。外层循环为n次,内层循环分别为n-1, n-2…1次。时间复杂度: O(n^2)稳定性:稳定实现:转载 2014-06-08 09:57:02 · 357 阅读 · 0 评论 -
字符串系列之:逆序输出字符串
字符串系列之:逆序输出字符串字符串的各种操作向来也是面试官的最爱,从简单的开始:逆序输出字符串。实现1: 1: void reverse(const char *str) 2: { 3: ssize_t i; 4: size_t len = strlen(str); 5: 6: for转载 2014-06-08 10:09:00 · 515 阅读 · 0 评论 -
从数组中找出最大的和最小的数
从数组中找出最大的和最小的数给定一整形数组a,要求从中找出最大的数和最小的数,并计算时间复杂度。实现1:遍历数组,每次取数组中一个元素, 分别与当前最大值和最小值进行比较,时间复杂度O(2n) 1: void search(int a[], size_t n, int &max, int &min) 2: { 3: int i;转载 2014-06-08 10:05:41 · 1220 阅读 · 0 评论 -
线性表之顺序存储结构
线性表之顺序存储结构线性表的顺序存储是指用一组地址连续的存储单元一次存储线性表的数据元素。在C语言中,可以使用动态数组来实现线性表的顺序存储。定义: 1: #define LIST_INIT_SIZE 100 2: #define LIST_INCREMENT 10 3: 4: typedef struct {转载 2014-06-08 10:03:49 · 408 阅读 · 0 评论 -
最大公约数:辗转相除法
最大公约数:辗转相除法在数学中, 辗转相除法,又称欧几里得算法,是求最大公约数的算法。其算法步骤:a,b相除将b赋值给a将余数赋值给b若b为0, 则a为最大公约数;否则执行步骤1-3直至b为0。例如计算6和4的最大公约数:a=6,b=4,a/b余数为2将b赋值给a,a=4将余数赋值给b,b=2b不为0, 重复执行1-3a=4,b=2,a/b余数为0将b赋转载 2014-06-08 10:06:39 · 523 阅读 · 0 评论 -
链表有关的常见面试题
链表有关的常见面试题1.单链表逆序实现1:遍历: 1: /* 2: * 遍历链表, 将每个结点的next置为其前驱 3: * 遍历过程中需要额外的指针来记录结点的前驱和后继 4: */ 5: LinkList ReverseList(LinkList L) 6: { 7: if (!L ||转载 2014-06-08 10:01:03 · 389 阅读 · 0 评论 -
求一个数的二进制表示中1的个数
求一个数的二进制表示中1的个数实现1:使用按位与和移位操作符,逐位进行统计。需要注意的是,对于有符号的右移操作符号位如何处理是不确定的,因此我们在进行移位操作前要将有符号型转换为无符号型。 1: int bitcount(int n) 2: { 3: unsigned int count = 0, m = n; /* 注意, 我们这里转载 2014-06-08 09:59:40 · 451 阅读 · 0 评论 -
直接插入排序
直接插入排序直接插入排序是一种比较容易理解的排序算法,其核心思想是遍历数组,将数组中的元素逐个插入到已排序序列中。时间复杂度:O(n^2)稳定性:稳定实现: 1: /* @brief insetion sort 2: * insert the new element to the sorted subarray 3: */转载 2014-06-08 09:55:14 · 331 阅读 · 0 评论 -
排序算法总结
排序算法有:插入排序,合并排序,冒泡排序,选择排序,希尔排序,堆排序,快速排序,计数排序,基数排序,桶排序(没有实现)。比较一下学习后的心得。我不是很清楚他们的时间复杂度,也真的不知道他们到底谁快谁慢,因为书上的推导我确实只是小小了解,并没有消化。也没有完全理解他们的精髓,所以又什么错误的还需要高手指点。呵呵。1.普及一下排序稳定,所谓排序稳定就是指:如果两个数相同,对他们进行的排序结果为转载 2014-06-08 12:45:09 · 462 阅读 · 0 评论 -
选择排序
选择排序选择排序是一种简单直观的排序算法,其核心思想是:遍历数组,从未排序的序列中找到最小元素,将其放到已排序序列的末尾。时间复杂度:O(n^2)稳定性 :不稳定 1: /* 2: * @brief selection sort 3: */ 4: void 5: selection_sort(int a[], i转载 2014-06-08 09:53:09 · 318 阅读 · 0 评论 -
两数交换
两数交换 在排序算法中,我们经常需要交换两个数的值, 在进入算法之前,先在这里复习一下两数交换的实现方法,算是开胃小菜。实现1:最简单的也是最常用的实现: 1: void swap(int *a, int *b) 2: { 3: int temp = *a; 4: *a = *b;转载 2014-06-08 10:09:55 · 493 阅读 · 0 评论