快速排序
public class Main{
static int[] arr = {100,99,88,66,55,77,11,22};
public static void main(String args[]) {
//将数组的首尾数传进去
quickSort(0,arr.length-1);
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]+" ");
}
}
//快速排序为 O (NlogN)
private static void quickSort(int left, int right ) {
int i,j,t,temp;
if(left>right) return ;
//注意区分索引和索引所指向的值
temp =arr[left]; //基准数
i=left; //最左索引
j=right; //最右索引
while(i!=j) { //两个索引没有相遇的时候
while(arr[j]>=temp && i<j) //如果右边的索引所指向的值 大于基准数 则j索引继续左移
j--;
while(arr[i]<=temp && i<j) //如果左边的索引所指向的值 小于基准数 则i索引继续又移
i++;
if(i<j) { //当两者都满足以上情况 则交换
t=arr[i];
arr[i]=arr[j];
arr[j]=t;
}
}
//循环结束 此时i=j 将基准数arr[left]交换
arr[left]=arr[i];
arr[i]=temp;
//二分快排 拆分成两个
quickSort(left, i-1);
quickSort(i+1, right);
}
}
组合数问题
public class Main{
//从n个球中选取m个球 递归实现
public static void main(String args[]) {
int k=f(5,3);
System.out.println(k);
}
private static int f(int n, int m) {
//递归出口
if(m>n) return 0; //如果从 2个球中选 3 个球 方法只有0种
if(m==0) return 1; //如果从 X个球中选 0 个球 方法只有一种
if(n==0) return 0; //如果从 0个球中选 3 个球 方法只有0种
//假设明确选定了一个球 如 总共5个球 4个白球1个红球 向其中选3个球 红球是我确定选的
//则分两种情况一个是有红球的一组 一个是无红球的一组
//f(n-1,m-1)表示红球拿了 所有我只要从4个球里再选2个就好
//f(n-1,m)表示不拿红球 所以我要在4个球里选3个
return f(n-1,m-1)+f(n-1,m);
}
}
全排列递归的两种实现形式
public class Main{
//全排列的第二种实现方法 交换法
public static void main(String args[]) {
char[] c = "ABC".toCharArray();
f(c,0);
int[] a = {1,2,3};
ff(a,0);
System.out.println("*****");
int[] flag= {0,0,0};
f2(a,0,flag);
}
private static void f(char[] c,int n) {
if(n==c.length) {
for(int i=0;i<c.length;i++) {
System.out.print(c[i]);
}
System.out.println();
}
for(int i=n;i<c.length;i++) {
{char tempc = c[i]; c[i] = c[n]; c[n] = tempc;}
f(c,n+1);
{char tempc = c[i]; c[i] = c[n]; c[n] = tempc;}//回溯
}
}
//更具通用性
private static void ff(int[] c,int n) {
if(n==c.length) {
for(int i=0;i<c.length;i++) {
System.out.print(c[i]);
}
System.out.println();
}
for(int i=n;i<c.length;i++) {
{int tempc = c[i]; c[i] = c[n]; c[n] = tempc;}
ff(c,n+1);
{int tempc = c[i]; c[i] = c[n]; c[n] = tempc;}//回溯
}
}
//标记 递归回缩
private static void f2(int[] arr,int step,int[] flag) {
if(step==arr.length) {
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]);
}
System.out.println();
return ;
}
for(int i=0;i<arr.length;i++) {
if(flag[i]==0) {
arr[step]=i+1;
flag[i]=1;
f2(arr,step+1,flag);
flag[i]=0; //回溯
}
}
}
}