一、汉诺塔
比如有两个盘子,
当n=1时,可以把所有盘子分为两部分,一部分均以排好,只差一个
借助这个思想,比如有6个盘子,
我们把最左边的看作一个盘子的话,只需要,把左边的移动到最右边,再把中间的移动到最右边,就完成了任务。
接着来处理剩下的五个盘子,把最右边的看组后一个盘子,最中间看作一个盘子,此时只需要,把最右边的移动到最右边,
再把中间的移动到最右边即可。
把大问题分解,直到可以求解。每个子任务完成合并,此时大任务也就完成了。
#include<stdio.h>
void hannuo(int n,char x,char y,char z);//n代表移动多少个 ,x,y,z代表放盘子的针
void hannuo(int n,char x,char y,char z){
if(n==1)
{printf("%c-->%c\n",x,z); }
else{
hannuo(n-1,x,z,y);
printf("%c-->%c\n",x,z);
hannuo(n-1,y,x,z);
}
}
int main(){
int n;
printf(" 请输入汉诺塔的层数:\n");
scanf("%d",&n);
hannuo(n,'x','y','z');
return 0;
}
二、快速排序
通过一趟排序将待排序数据分割成独立的两部分,其中一部分的所有元素均比另一部分元素小,然后分别对这两部分继续排序,重复上述步骤直到完成。
(快速排序选择元素不同分区也有差异,实现算法也不同,此处只说明一种,从中间分开)
#include<stdio.h>
void quickSort(int array[],int left,int right){
int i=left,j=right;
int temp;
int pivot;//基准
pivot=array[(left+right)/2];
while(i<=j)
{
//从左到右找到大于等于基准点的元素
while(array[i]<pivot){
i++;
}
//从右到左找到小于等于基准点的元素
while(array[j]>pivot){
j--;
}
//如果i<j,则互换元素
if(i<=j){
temp=array[i];
array[i]=array[j];
array[j]=temp;
i++;
j--;
}
}
if(left<j)//右小于 左
{
quickSort(array,left,j);
}
if(i<right){
quickSort(array,i,right);
}
}
int main(){
int array[]={73,108,111,101,70,188,112,115,44,77,109,22,75};
int i,length;
length=sizeof(array)/sizeof(array[0]);
quickSort(array,0,length-1);
printf("排序后的结果是:\n");
for(i=0;i<length;i++){
printf("%d ",array[i]);
}
return 0;
}