
算法
大芝士球
一个平凡人心中的波澜壮阔
展开
-
快速排序
快速排序由于其效率在同为O(n * log n)的几种排序方法中效率较高,故经常被使用,其思想为:分治法 该算法的基本思想是:1.先从数列中取出一个数作为枢轴数。2.分组过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数,达到整个序列的有序目的(PS:怎么和归并排序的算法思路这么像。。。) 代码所需...原创 2018-02-26 18:59:12 · 272 阅读 · 0 评论 -
快慢指针找链表中点
今天在刷leetcode的题目 Palindrome Linked List的时候,想出来的解决算法的空间复杂度都在O(n),不符合题目的限制,在看了几个博客以后发现他们的解决方案都用到了一个方法查找链表的中点: 快慢指针找链表中点法算法的思路是:定义一个快指针fast 一个慢指针slow ,快指针一次移动两个结点,慢指针一次移动一个结点当fast到达链表的尾...原创 2018-02-26 22:11:58 · 3789 阅读 · 1 评论 -
冒泡排序
基本思想:两两比较相邻记录的关键字,若顺序反了就进行交换,直到所有元素排序正确将要排序的一组数字进行遍历。第一次遍历,将相邻的两个数字进行比较,直到这组数字全部比较完成,如果前面比后面的数字大,则进行交换位置,此时可以将最大的数字筛选出来,放到最后的位置上。第二次遍历,将相邻的两个数字进行比较,直到这组数字全部比较完成,如果前面比后面的数字大,则进行交换位置,将这组数字里面第二大的数字...原创 2018-02-23 20:34:22 · 212 阅读 · 0 评论 -
简单选择排序
基本思路:通过n-i次的关键字比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换算法所需结构:#define MAX 10//排序所用的顺序表结构 typedef struct{ int a[MAX+1]; //存储排序数组,a[0]用作临时变量 int length; //记录顺序表的长度 }Sqlist;//交换 v...原创 2018-02-23 20:55:42 · 375 阅读 · 0 评论 -
直接插入排序
基本思路:将一个记录插入到已经排好序的有序表中,得到一个新的、长度加一的有序表使用的结构:#define MAX 10//排序所用的顺序表结构 typedef struct{ int a[MAX+1]; //存储排序数组,a[0]用作临时变量 int length; //记录顺序表的长度 }Sqlist;//交换 void swap(Sqlist *L,int i,...原创 2018-02-24 13:59:50 · 140 阅读 · 0 评论 -
堆排序
简单的选择排序中没有把每一次比较的结果保存,在下一次的比较中有许多比较已经在前一次做过了,但由于没有保存,所以下一次的排序又重复执行了这些比较,因而记录的次数很多。堆排序正是在这个部分有所优化。堆的基本概念:是具有一些性质的完全二叉树-----每个结点的值都大于或等于其左右孩子结点的值,称大顶堆;小于等于的,称为小顶堆若按层序遍历的方式给结点1开始编号,则有: Ki>=K2i ...原创 2018-02-24 17:11:17 · 127 阅读 · 0 评论 -
归并排序 (有迹可循)
归并:将两个或两个以上的有序表组合成一个新有序表。基本思路: 归并排序采用了分治策略(divide-and-conquer),就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解。(也就是将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。) 先递归的把数组划分为两个子数组,一...转载 2018-02-25 15:54:52 · 221 阅读 · 0 评论 -
查找算法:线性查找
查找表分为两大类:静态查找表、动态查找表线性查找即为静态查找int search(int a[],int key,int n){ int i; for(i=0;i<=n;i++) { if(a[i]==key) return i; } return 0; } 向线性查找中加入标记可以将算法效率提高数倍int search(int a[],int key,int ...原创 2018-03-05 22:07:47 · 504 阅读 · 0 评论 -
查找:二分查找
二分查找又称折半查找,使用条件是 有序的线性表并顺序存储int Binary_search(int a[],int n,int key){ int low,high,mid; low=0; high=n; //注意是n while(low<=high) //可以试试 low<high { mid=(low+high)/2; ...原创 2018-03-05 22:21:22 · 198 阅读 · 0 评论