
数据结构和算法
文章平均质量分 59
逐月and
这个作者很懒,什么都没留下…
展开
-
插入排序
#includeusing namespace std;//插入排序void Insert_Sort(int *a,int n){ int i,j; for(i=0;i<n;i++) { int temp=a[i]; for(j=i-1;j>=0;j--) { if(temp<a[j]) a[j+1]=a[j]; else break;原创 2015-03-15 10:27:02 · 479 阅读 · 0 评论 -
如何找出数组中出现次数为奇数次的唯一元素
采用异或的方式进行结果的搜索!!!#includeusing namespace std;//找出数组中出现次数为奇数次的唯一元素int Find_JI(int *a,int n){int result=0;for(int i=0;i{result^=a[i];}return result;}int main(){int a[原创 2015-03-13 21:50:51 · 895 阅读 · 1 评论 -
如何用递归实现数组求和
#includeusing namespace std;int Sum(int *p,int n){return n==0?0:(Sum(p,n-1)+p[n-1]); //递归语句部分}int main(){int a[]={1,2,3,4,5,6,7,8,9};int length=sizeof(a)/sizeof(a[0]);int s原创 2015-03-11 16:47:23 · 766 阅读 · 0 评论 -
使用递归和非递归两种方法实现二分查找!!!
#includeusing namespace std;//非递归的方法int F_BinarySearch(int a[],int n,int Number){if(a==NULL||n{return -1;}int begin=0,end=n-1;while(begin{int mid=begin+(end-begin)/2;if(N原创 2015-03-11 19:31:12 · 1586 阅读 · 0 评论 -
寻找连续数组中缺失的数字!!
问题:给一个由 n-1 各整数组成的未经排序的数列,其元素都是 1--n 中的不同的整数。如何找出缺失的整数??算法设计:采用求和法进行查找。#includeusing namespace std;//找出数列中符合条件的数对的个数int Find_lost(int *a,int n){ int sum=0,sum1=0; for(int i=0;i<n;i++) {原创 2015-03-14 11:38:56 · 3248 阅读 · 0 评论 -
在 1--N 的连续数组中找出唯一重复的元素
采用两种方法:求和法和异或法#includeusing namespace std;//采用求和的方法int Find_sum(int *a,int n){int sum=0,sum1=0; //用 sum 来存储 1--N 这 N 个数的和,用 sum1 来存储 1--N-1 这 N-1 个数的和for(int i=0;isum += a[i];f原创 2015-03-13 20:55:58 · 848 阅读 · 0 评论 -
在已经排好序的数组中统计给定数字出现的次数
首先通过二分查找法,在数组中查找是否存在所给定的数字,若可以找到,则在此数的前后再进行查看,看是否存在连续的一样的数字,进行统计。程序如下:#includeusing namespace std;int BinarySearch(int a[],int n,int Number){if(a==NULL||n{return -1;}int begin=原创 2015-03-11 20:33:39 · 608 阅读 · 0 评论 -
计算两个有序数组的交集
#includeusing namespace std;//采用二路归并法,查找两个数组的交集进行保存,并返回交集的个数。int mix(int a[],int m,int b[],int n,int *c){int i=0,j=0,k=0;while(i{if(a[i]>b[j])j++;else if(a[i]i++;else原创 2015-03-12 10:48:49 · 765 阅读 · 0 评论 -
在时间复杂度为 O(n) 内找出数组中出现次数超过一半的数
#includeusing namespace std;//在时间复杂度为 O(n) 内找出数组中出现次数超过一半的数int Find(int *a,int n){if(nreturn -1;int Num=0;int count=0;for(int i=0;i{if(count == 0){Num=a[i];count=1;}e原创 2015-03-13 20:04:04 · 597 阅读 · 0 评论 -
数组选择(简单)排序
基本原理:对于给定的数组,经过第一轮比较后得到最小数,然后将该最小数与第一个数的位置进行交换,接着对剩下的数进行类似的查找,交换操作,直到只剩下一个数为止。此算法的复杂度为:O(n^2)。(参考程序员面试笔试宝典--何昊)程序如下:#includeusing namespace std;//选择排序(简单排序)void Simple_Sort(int *a,int n){ in原创 2015-03-14 17:32:07 · 1280 阅读 · 0 评论 -
找出有序数列中符合条件的数对的个数
问题描述:一个有序整数数组,元素取值可能是 1--N 中的任何一个,相同的数值不会重复出现。设计一个算法:找出有序数列中符合条件的数对的个数,满足数对中两数之和为 N+1使用二分法查找,用两个指针分别指向最开始和最后的一个数,从两端向中间遍历,直到两个指针交叉#includeusing namespace std;//找出数列中符合条件的数对的个数void Fin原创 2015-03-14 11:19:22 · 879 阅读 · 0 评论 -
使用递归算法判断数组递增!!
#includeusing namespace std;//使用递归算法对数组进行判定的函数!!bool Result(int a[],int n){if(n==0){coutexit(0);}else if(n==1)return true;else{return (Result(a,n-1)&&(a[n-1]>a[n-2]));}原创 2015-03-11 17:44:21 · 659 阅读 · 0 评论 -
冒泡排序
单向冒泡排序基本思想(假设由小到大排序):从第一个记录开始,依次对相邻的两个记录进行比较,当前面的记录大于后边的记录时,交换其位置,进行一轮比较和换位之后,n个记录中的最大记录位于第 n 位,然后对前面的 (n-1) 个记录进行第二轮比较;重复该过程,直到剩下一个时候为止。#includeusing namespace std;//交换位置void Swap(int &a,int &原创 2015-03-15 11:16:12 · 383 阅读 · 0 评论 -
归并排序
归并排序利用递归和分治技术将数据序列划分为越来越小的半子表,在对半子表排序,最后在用递归将排序好的半子表合并成为越来越大的有序数组。程序代码:#includeusing namespace std;void Merge(int a[],int l,int q,int r){ int i,j,k,nl,nr; nl=q-l+1; nr=r-q; int *L=new int[原创 2015-03-16 10:54:16 · 435 阅读 · 0 评论 -
重新排列数组,使得数组左边的数字为奇数,数组右边的数字为偶数
源程序:#includeusing namespace std;void Swap(int &a,int &b){ int temp; temp=a; a=b; b=temp;}void Change(int *a,int n){ int nl=0; int nr=n-1; while(nl<nr) { while(nl<nr&&a[nl]%2==1)原创 2015-03-16 15:17:51 · 733 阅读 · 0 评论 -
查找数组中第二大的数
方法一:先进行排序,然后直接很具数组下标对倒数第二个数进行查找即可,此时时间复杂度最好为:O(nlogn)方法二:设置两个变量(一个保存最大的数,一个保存第二大的数)进行判断。对数组进行一边的遍历,即可在时间复杂度为 n 的情况下查找出第二大的数。程序代码:#includeusing namespace std;int Find_Sec(int *a,int n){ int原创 2015-03-16 15:34:31 · 2128 阅读 · 0 评论 -
快速排序
快速排序:采用“分而治之”的思想,将大拆小,小拆更小。其最坏情况下时间复杂度为:O(n^2);平均时间复杂度为:O(nlogn)。其中基准关键字的选取是决定快速排序算法性能的关键。常采用:1)三者取中(首,尾,中间);2)取随机数(取最左,最右之间的平均数)程序代码:#includeusing namespace std;void QuickSort(int a[],int l,in原创 2015-03-16 14:00:08 · 433 阅读 · 0 评论 -
找出数组中的最大数和最小数
方法:利用两个变量来分别存储最大值和最小值,并在数组遍历过程中进行判断程序:#includeusing namespace std;void Find_MM(int *a,int n){ int Max=a[0]; int Min=a[0]; for(int i=1;i<n;i++) { if(a[i]>=Max) { Max=a[i]; } if(a原创 2015-03-16 15:45:47 · 4975 阅读 · 0 评论 -
判定数组中是否存在重复元素
问题:数组有 n 个元素,元素取值范围为 1--n ,如何判定是否存在重复的元素?遍历数组法:假设在第 i 的位置的数字为 j ,则通过交换数字 j 到第 j 的位置,直到所有的数字都出现在自己的位置,或者发生冲突。#includeusing namespace std;//判定数组中是否存在重复元素int Find_repeat(int *a,int n){ int j=原创 2015-03-14 12:27:04 · 924 阅读 · 0 评论 -
判断一个数组中的数值是否连续相邻
一个整数数列,元素在 0--65535 中任意取值,相同的数字不会重复出现,0是例外,可以反复出现。#includeusing namespace std;//判断一个正数数组中数值是否连续(不存在数值相等的情况)bool IsContinue(int *a,int n){int max=-1,min=-1;int count=0;原创 2015-03-13 21:32:13 · 1108 阅读 · 0 评论 -
如何用一个 FOR 循环打印出一个二(三)维数组
#includeusing namespace std;const int X=2;const int Y=5;const int Z=2;//二维数组的单循环输出void Show2(){int a[X][Y]={1,2,3,4,5,6,7,8,9,0};int S=X*Y;for(int i=0;icoutcout}//三原创 2015-03-11 17:09:28 · 1054 阅读 · 1 评论 -
C++排序方法汇总
包括:1-选择排序、2-插入排序、3-冒泡排序、4-归并排序、5-快速排序、6-希尔排序、7-堆排序主函数:#include#include"Sort.h"using namespace std;int main(){ Sort S; int a[]={1,3,5,7,9,2,4,6,8,0}; int len = sizeof(a)/sizeof(a[0]); cout<原创 2015-07-17 16:06:04 · 734 阅读 · 0 评论