![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
常规算法探究与数据结构
chenyu964877814
这个作者很懒,什么都没留下…
展开
-
各种排序算法分析总结
排序算法: 1)分类: 1)插入排序(直接插入排序、希尔排序) 2)交换排序(冒泡排序、快速排序) 3)选择排序(直接选择排序、堆排序) 4)归并排序 5)分配排序(箱排序、基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序。转载 2012-08-28 20:12:46 · 543 阅读 · 0 评论 -
排序之------快速排序
void swap(int* a,int* b) { int temp; temp=*a; *a=*b; *b=temp; } int Partition(int array[], int low, int high) { int pivot = array[low]; while (low < high) { while (low = pivot) {原创 2012-08-26 20:42:17 · 450 阅读 · 0 评论 -
半素数
哥德巴赫猜想(任何大于六的偶数都可以写成两个奇质数的和) 题目定义了一种叫半素数的数:只要一个数能被分解成两个素数,那么这个数就是半素数。 Prime Number Definition An integer greater than one is called a prime number if its only positive divisors (factors) are on原创 2012-08-28 10:57:33 · 4181 阅读 · 1 评论 -
最大子序列和问题
问题: 给定一整数序列A1, A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大 例如:整数序列-2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子序列的和为21。对于这个问题,最简单也是最容易想到的那就是穷举所有子序列的方法。利用三重循环,依次求出所有子序列的和然后取最大的那个。当然算法复杂度会达到O(n^3)。原创 2012-08-27 20:59:09 · 1120 阅读 · 0 评论 -
判断两个数组中是否存在相同的数字
判断两个数组中是否存在相同的数字 给定两个排好序的数组,怎样高效得判断这两个数组中存在相同的数字? 这个问题首先想到的是一个O(nlogn)的算法。就是任意挑选一个数组,遍历这个数组的所有元素,遍历过程中,在另一个数组中对第一个数组中的每个元素进行binary search。用C++实现代码如下: bool findCommon(int a[],int size_a,int b[],int原创 2012-08-27 20:35:07 · 9420 阅读 · 2 评论 -
查找链表的中间节点
Node* findMid(Node* head) { Node *p=head,*q=head; if (head==0||head->next==0) return head; do { p=p->next; q=q->next->next; } while (q&&q->next); return p; }原创 2012-08-27 21:04:43 · 590 阅读 · 0 评论 -
链表反转
void reverse(Node*& head) { if(head==NULL) return ; Node* pre,*cur,*p; pre=head; cur=head->next; while(cur) { p=cur->next; cur->next=pre; pre=cur; cur=p; } head->next=NULL; head=pre原创 2012-08-27 19:33:28 · 665 阅读 · 0 评论 -
文件中有一组整数,要求排序后输出到另一个文件中
#include #include #include using namespace std; void BubbleSort(vector& array) { for (int i=0;i!=array.size();i++) { for (int j=array.size()-1;j!=i;j--) { if (array[j]<array[j-1]) {原创 2012-08-27 15:55:31 · 5179 阅读 · 1 评论 -
堆排序
template void shift_up(T A[],int position) { if(position!=1) while(position!=1) { if(A[position/2]<A[position]) swap(A[position/2],A[position]); else break; posit原创 2012-08-27 11:32:40 · 470 阅读 · 0 评论 -
合并排序
void merge(int A[],int p,int q,int r) { T* bp=new T[r-p+1]; int i=p,j=q+1,k=0; while(i<=q&&j<=r) { if (A[i]<=A[j]) { bp[k++]=A[i++]; } else { bp[k++]=A[j++]; } } if (i!=q+1原创 2012-08-27 10:08:35 · 413 阅读 · 0 评论 -
希尔排序
void Shell_Sort(int a[], int n) { int h,i,j,temp; for (h=n/2; h>0; h=h/2) { for (i=h; i<n; i++) { temp = a[i]; for (j=i-h; j>=0 && temp < a[j]; j-=h) { a[j+h] = a[j];原创 2012-08-26 22:23:03 · 355 阅读 · 0 评论 -
选择排序
void swap(int* a,int* b) { int temp; temp=*a; *a=*b; *b=temp; } void selectSort(int* array, int nLen) { for (int i=0;i!=nLen;i++) { int temp=i; for (int j=i+1;j!=nLen;j++) { if (array[j原创 2012-08-26 21:46:03 · 373 阅读 · 0 评论 -
冒泡排序
void swap(int* a,int* b) { int temp; temp=*a; *a=*b; *b=temp; } void BubbleSort(int* array, int nLen) { for (int i=0;i!=nLen;i++) { for (int j=nLen-1;j!=i;j--) { if (array[j]<array[j-1])原创 2012-08-26 21:35:42 · 444 阅读 · 0 评论 -
2012年8月25日---学习笔记---概率
面试题: Please write out the program. #include #include #define LOOP 1000 void main() { int ragnc=0; for(int i=0;i!=LOOP;i++) { int x=rand(); int y=rand(); if(x*x+y*y<RAND_MAX*RAND_MAX)原创 2012-08-25 00:37:00 · 4391 阅读 · 0 评论 -
2012年8月24日学习笔记---程序员面试宝典---等长数组....
//有两等长数组A/B,所含元素相同,但顺序不同,只能取得A数组某值和B数组某值进行比较,比较结果为大于,小于,等于,但是不能取得同一数组A或者B中两个数进行比较//,也不能取得某数组中的某个值,找到一个好的算法实现正确匹配,(即A数组中某值与B中某值等值),分析算法时间复杂度,写出算法思路即可。 Store c[10]; void RandCmp(int A[],int B[],int num原创 2012-08-24 21:39:47 · 4509 阅读 · 0 评论 -
2012年8月24日--学习笔记---螺旋队列
#include #include #include using namespace std; #define abs(a) ((a)>0?(a):(-a)) #define max(a,b) ((a)>(b)?(a):(b)) int spiralval(int x,int y) { int cycleNum= max(abs(x),abs(y)); i原创 2012-08-24 21:31:03 · 3472 阅读 · 0 评论 -
插入排序--直接插入排序和希尔排序
//直接插入排序void InsertSort(int array[],unsigned int n) { for (int i=1;i!=n;i++) { int temp=array[i],j; for(j=i-1;0<=j&&temp<array[j];j--) { array[j+1]=array[j]; }原创 2012-08-26 21:19:25 · 372 阅读 · 0 评论