-
快速排序算法是根据分治策略来设计的,简述其基本思想:
- 快速排序算法基本思想:通过一趟排序利用基准元素将要排序的序列分成两部分,其中一部分的元素全部小于基准元素,另一部分的元素全部大于基准元素,之后对这两部分在进行拆分排序,直到待拆分的序列足够小,最后整体变得有序。
- 分治策略的基本思想:对于一个大规模问题,将其拆分为规模足够小的n个子问题,子问题可以直接求解,最后将子问题的解合并得到原来大规模问题的解。
-
设计一个算法,采用分治法求一个整数序列中的最大最小元素:
#include <stdio.h>
void swap(int a[], int low, int high){ //交换
int t = a[low];
a[low] = a[high];
a[high] = t;
}
int partition(int a[], int low, int high) //计算基准元素,分割为左右两个数组
{
int point = a[low];//第一个元素设为基准元素
while(low<high) {
while(low<high && a[high]>=point){//high比较并左移动
high--;
}
swap(a,low,high);
while(low<high && a[low]<=point){//low比较并右移
low++;
}
swap(a,low,high);
}
return low;//返回基准元素的位置
}
void quicksort(int a[], int low, int high) { //low:起始位置 high:末尾位置
if(low<high){
int point = partition(a,low,high);
quicksort(a,low,point-1); //对基准元素的左边进行排序
quicksort(a,point+1,high);//对基准元素的右边进行排序
}
}
int main()
{
int i;
int a[] = {2,6,59,1,25,35,12,11,5};
int n = 9;
printf("比较序列为:") ;
for(i=0; i<n; i++) printf("%d ", a[i]);
quicksort(a, 0, n-1);
printf("\n最小:%d,最大:%d\n",a[0],a[n-1]) ;
return 0;
}
![](https://img-blog.csdnimg.cn/d1eb7344945b44288882efb3aeac8e00.png)
-
设计一个算法,采用分治法求x得n次方:
-
int divide(int x, int n) {
if (n==1||n==0)
return x;
else {
if (n%2==0)//如果是偶数
return divide(x,n/2)*divide(x,n/2);
else//如果是奇数
return divide(x,(n+1)/2)*divide(x,(n-1)/2);
}
}