算法
cany1000
积极,向上,努力,踏实。
展开
-
插入排序法(二)
前面已排好,从下标1开始比较。#include using namespace std;void InsertSort(int a[],int n){ int key,i = 1; while(i < n) { key = a[i]; int j = i-1; for(;j>=0;j--) { if(a[j] > key) { a[j+1] =原创 2016-04-03 16:57:22 · 276 阅读 · 0 评论 -
二叉树排序
1、二叉树排序--1)一个无序整数数组--2)创建二叉树,数组第一个元素为根结点,数组中下一个元素小于根的值放左边,大于的放右边。--3)中序遍历,结果即为数组从小到大的排序。2、代码实现#include using namespace std;#define dim(x) (sizeof(x)/sizeof(x[0]))void swap(int *x,int *y)原创 2017-01-03 16:05:57 · 1153 阅读 · 0 评论 -
折半插入排序
1、折半插入排序-定义---- 当直接插入排序进行到某一趟时,对于a[i]来讲,前边i-1个记录已经是有序的。此时可以不再用直接插入排序的方法,而改为先用折半查找法找出a[i]应插的位置,然后再插入。这种方法就是折半插入排序。2、算法思想---1)初始化:设定有序区为第一个元素,设定无序区为后面所有元素---2)依次取无序区的每个元素---3)通过二分法查找有序区,返回比这原创 2017-01-03 13:53:09 · 393 阅读 · 0 评论 -
希尔排序
1、希尔排序是对直接插入排序进行改进后增加效率的排序算法。---- 直接插入排序的效率在某些时候是很高的,比如:--1)我们的记录本身就是基本有序的,只需要少量的插入操作,就可以完成整个记录集的排序工作。--2)记录数比较少的时候。思想:-- 如何将待排序的记录个数较少?将原本有大量记录数的记录进行分组,分割成若干个子序列,此时每个子序列待排序的记录个数就比较少了,然后在这原创 2016-09-07 14:07:13 · 268 阅读 · 0 评论 -
快速排序
1、快速排序---- 快速排序(Quicksort)是对冒泡排序的一种改进,由C.A.R.Hoare在1962年提出。它的基本思想是:通过“一趟排序”将要排序的数据分割成独立的两部分,其中左部分的所有数据都比右部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。2、算法过程---- 设要排序的数组是A[0]原创 2017-01-02 16:34:06 · 286 阅读 · 0 评论 -
排序-冒泡排序
1、排序---- 假设含有n个记录的序列为{r1,r2,....,rn},其相应的关键字分别为{k1,k2,....,kn},需确定一种排列,使其相应的关键字满足非递减/非递增的关系,即使得序列称为一个按关键字有序的序列,这样的操作就称为排序。2、排序的稳定性---- 假设ki=kj(1排序后ri仍然领先于rj,则称所用的排序方法是稳定的,反之,若可能使得排序后的序列中rj领先原创 2016-09-06 11:02:19 · 381 阅读 · 0 评论 -
顺序查找和二分查找
1、顺序查找---- 又称线性查找,是从数组的第一个元素开始查找,直到找到待查找元素的位置。顺序查找适合于存储结构为顺序存储或链接存储的线性表。使用for循环等实现。int Find(int a[],int x){ int index = -1; for(int i=0;i<(sizeof(a)/sizeof(a[0]));i++) { if(a[i]==x) {原创 2017-01-02 15:15:27 · 3170 阅读 · 0 评论 -
堆排序
1、堆排序---- 大顶堆---- 小顶堆2、算法实现#define MaxSize 10 //要排序数组元素的最大值,可根据需要修改typedef struct { int r[MaxSize+1];//用于存储要排序数组,r[0]用作哨兵或临时变量 int length; //用于记录顺序表的长度}SqList;void swap(SqList *L,int i,原创 2016-09-08 14:46:25 · 419 阅读 · 0 评论 -
双向冒泡排序
1、从两边同时进行冒泡排序一次排出一个最大值和最小值,n/2次,即while(left#include using namespace std;#define dim(x) (sizeof(x)/sizeof(x[0]))void swap(int *x,int *y){ int t = *x; *x = *y; *y = t;}//双向冒泡:从数组两端同时进行冒泡v原创 2017-01-02 14:00:26 · 1281 阅读 · 0 评论 -
链表分割
题目描述编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。/*struct ListNode { int val; struct ListNode *next; ListNode(int x):va原创 2016-10-20 17:15:34 · 277 阅读 · 0 评论 -
链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。/*struct ListNode { int val; struct ListNode *next; ListNode(int x):val(x), next(NULL) { }};*/class Solution { public: ListNode* FindKthToTail(Lis原创 2016-10-20 17:10:29 · 210 阅读 · 0 评论 -
插入排序法(一)
插入排序法: 假设前面所有的数都已排好序,将后面的数从后向前依次和已排好序的进行比较,直到出现比它小的,插在它的后面。代码如下:#include #include using namespace std;/* **** 插入排序 一直一个已排好序的序列,对新来的数,从后往前依次与排好序的数进行比较 直到找到比此数小的,然后插在它之后。*//原创 2016-03-22 13:48:05 · 324 阅读 · 0 评论 -
求二进制数中1的个数
1、对于一个int型的变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能的高。算法一:---- 对整数除以2,余1的个数就是二进制表示中“1”的个数。#include using namespace std;int main(){ int number; cout<<"请输入一个整数:\n"; while(cin>>number) { int count原创 2016-10-24 14:20:28 · 536 阅读 · 0 评论 -
排序算法的稳定性
常见的排序算法的稳定性,每个都给出简单的理由。(1)冒泡排序冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改 变,所以冒泡排序是一种稳定排序算法。转载 2016-09-07 20:39:56 · 353 阅读 · 0 评论 -
直接插入排序
1、直接插入排序(Straight Insertion Sort)---- 直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。2、算法实现#define MaxSize 10 //要排序数组元素的最大值,可根据需要修改typedef struct { int r[MaxSize+1];//用于存储要排序数组,r[0]用作哨兵或临时原创 2016-09-06 14:59:04 · 383 阅读 · 0 评论 -
简单选择排序算法
1、简单选择排序算法(Simple Selection Sort)---- 通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1#define MaxSize 10typedef struct { int r[MaxSize]; int length;}SqList;void swap(SqList *L,int i,int j){ int原创 2016-09-06 12:09:25 · 365 阅读 · 0 评论 -
折半查找法
1. 问题:假设现在有一个有序的数组array(已按升序排列好的),又有一个数num,现在查找这个数num是否在数组array中。问题分析:假设num在数组array中,那么怎么进行折半查找呢?1)先将num和数组中间的那个数比较2)如果num小于中间的那个数,那就继续在前一半进行查找3)如果num大于中间的那个数,就继续在后一半进行查找。4)如果查找到就返回num所在arr原创 2016-03-08 10:45:15 · 600 阅读 · 0 评论 -
归并排序法
1、归并排序法(Merge Sort)--- 以下简称MS,是分治法思想运用的一个典范,其主要算法操作可以分为以下步骤:--1)将n个元素分成两个含n/2个元素的子序列--2)用MS将两个子序列递归排序(最后可以将整个原序列分解成n个子序列)--3)合并两个已排序好的序列MS的关键在于Merge过程。对于这一过程的理解,算法导论中给出了一个形象的模型。即假设桌面上有两堆已排好序原创 2017-01-05 10:30:37 · 441 阅读 · 0 评论