二分查找算法(汉诺塔算法),归并排序

原创 2013年12月05日 10:30:11

二分查找算法(汉诺塔算法)

#include<stdio.h>

#include<stdlib.h>

int pickTopDisk(char *current,char x);

void hanoi(char *current,int n,char A,char B,char C);

int main()

{

char current[]={'A','A','A','A'};

char A='A',B='B',C='C';

hanoi(current,4,A,B,C);

return 0;

}

int pickTopDisk(char *current,char x)

{

int i=0;

while (current[i]!=x)

i++;

return i;

}

void hanoi(char *current,int n,char A,char B,char C)

{

static int count=0;

int i=0;

if(n==1)

{

i=pickTopDisk(current,A);

current[i]=C;

count++;

printf("move %d disk %d: %c->%c\n",count,n,A,C);

return;

}

hanoi(current,n-1,A,C,B);

current[n-1]=C;

count++;

printf("move %d disk %d: %c->%c\n",count,n,A,C);

hanoi(current,n-1,B,A,C);

}

 

归并排序

#include <stdio.h>

//将有序的SR[i...m]SR[m+1...n]归并为有序的TR[i...n]

void Merge(int SR[], int TR[], int i, int m, int n)

{

int j,k;

j = m+1;

k = i;

while(i<=m && j<=n)

if(SR[i]<=SR[j])

TR[k++] = SR[i++];

else

TR[k++] = SR[j++];

while(i<=m)

TR[k++] = SR[i++];

while(j<=n)

TR[k++] = SR[j++];

}

 

//SR[s...t]归并排序为TR1[s...t]

void MSort(int SR[], int TR1[], int s, int t)

{

int m;

int TR2[10];

if(s == t)

TR1[s] = SR[s];

else

{

m = (s+t)/2; //SR[s...t]平分为SR[s...m]SR[m+1...t]

MSort(SR,TR2,s,m);//递归地将SR[s...m]归并为有序的TR2[s...m]

MSort(SR,TR2,m+1,t); //递归地将SR[m+1...t]归并为有序的TR2[m+1...t]

Merge(TR2,TR1,s,m,t); //TR2[s...m]TR2[m+1...t]归并到TR1[s...t]

}

}

 

//主函数,调用归并排序MSort

void main()

{int i;

int s[10] = {2,6,7,4,5,10,9,1,3,8};

printf("输出这个数组:\n");

for(i=0;i<10;i++)

printf("%d ",s[i]);

printf("\n");

MSort(s,s,0,9);

printf("输出经过归并排序后的数组:\n");

for(i=0;i<10;i++)

printf("%d ", s[i]);

printf("\n");

}

 

 

#include <iostream>

#include <stdlib.h> // srand() 以及 rand()

#include <time.h> // time()

using namespace std;

int partion(int a[],int p,int r){

    //rand

    srand((unsigned)time( NULL));

    int e=rand()%(r-p+1)+p;

    int tem;

    tem=a[e];

    a[e]=a[r];

    a[r]=tem;

    int x=a[r], i=p-1;

    for (int j=p;j<r;j++){ 

        if (a[j]<=x){

            tem=a[i+1];

            a[i+1]=a[j];

            a[j]=tem;

            i++;

        }

    }

    tem=a[r];

    a[r]=a[i+1];

    a[i+1]=tem;

    return i+1;

}

 

void QuickSort(int a[],int p,int r){

    if (p<r){

        int q=partion(a,p,r);

        QuickSort(a,p,q-1);

        QuickSort(a,q+1,r);

    }

}

 

int main(){

    int array[]={0,-2,11,-4,13,-5,14,-43};

    QuickSort(array,0,7);

cout<<"输出这组数"<<endl;

    for(int i=0;i<=7;i++)

{

cout<<array[i]<<" ";

 

}

cout<<endl;

    return 0;

}

 

 

 

 

 

 

递归 --与三角数字,阶乘,变位字,汉诺塔问题,递归的二分查找法,归并排序

1)三角数字                                          数列1,3,6,10,15,21,...   这个数列中的第n项是由第n-1项加n得到的.       ...

算法学习-归并排序和二分查找

算法学习-归并排序和二分查找 一:归并排序 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 算法...

递归算法——归并排序,快速排序,二分查找

/* * 待排序的数组,算法输入 */ int arrIntegers[10] = { 0, 3, 1, 2, 5, 4, 8, 7, 9, 6 }; /* ...

二分查找算法和冒泡排序算法

  • 2015年04月22日 11:27
  • 942KB
  • 下载

c语言快速排序与二分查找算法

#include int r[20]; int Quick_Partition(int r[],int a,int b); int Binary_serch(int r[],int key,int n...

Python实现冒泡排序、选择排序、插入排序、快速排序、归并排序、二分法查找算法(基于《算法导论》伪代码)

为加深对各种基础排序算法的理解,我基于Thomas H. Cormen等《算法导论》中的伪代码,用Python实现了冒泡排序、选择排序、插入排序、快速排序、归并排序、二分法查找算法。 具体算法如下...
  • vernice
  • vernice
  • 2016年02月17日 10:11
  • 1897

十.用C语言实现查找算法 (1)顺序查找;(2)二分查找(折半查找);(3)二叉排序树;(4)哈希查找

程序名称:Search.cpp // 程序功能:采用结构化方法设计程序,实现多种查找算法。 // 程序作者:*** // 最后修改日期:2011-3-3 #include"iostream" #inc...

查找算法总结:顺序查找,二分查找,分块查找,散列查找,二叉排序树查找

查找算法包括:顺序查找,二分查找,分块查找,散列查找,二叉排序树查找,B树 B树用于查找磁盘数据,这里不进行分析顺序查找思想:从头到尾一个一个比较,简单,时间复杂度O(n)java实现:public...

堆排序查找前N个最大数和二分查找算法

先了解堆排序概念:堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。 (1)用大根堆排序的基本思想 ① 先将初...
  • wodet
  • wodet
  • 2013年11月25日 18:19
  • 1684
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二分查找算法(汉诺塔算法),归并排序
举报原因:
原因补充:

(最多只允许输入30个字)