最近在学动态规划中, 不断地提到分而治之思想和递归!
就想到能不能采用分而治之思想结合递归对数组进行排序,
代替以前的冒泡排序和选择排序呢?然后自己想着想着, 还真实现了!
代码如下:
/**
* 从小到大进行排序 指导思想: 分而治之+递归
*/
package mi;
import java.util.Scanner;
public class SortBySmallToBig {
private static int [] array;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
System.out.print("请输入数组的长度:");
int arrayLength = scanner.nextInt();
array = new int[arrayLength];
System.out.print("请依次为数组赋值:");
for(int i = 0; i < array.length; i++){
array[i] = scanner.nextInt();
}
//输出未排好序的数组
System.out.print("未排好序的数组:");
for(int i = 0; i < array.length; i++){
System.out.print(array[i] + " ");
}
System.out.println("");
//排序
sort(array, array.length - 1);
//输出排好序的数组
System.out.print("已经排好序的数组:");
for(int i = 0; i < array.length; i++){
System.out.print(array[i] + " ");
}
scanner.close();
}
/**
* 本函数的作用是从小到大进行排序 指导思想: 分而治之+递归
* @param array 待排序的数组
* @param lastIndex 最后一个元素
* @return 排序好的数组
*/
public static int [] sort(int [] array, int lastIndex){
//如果数组元素只有一个, 直接返回
if(lastIndex == 0){
return array;
}
//如果数组元素只有二个, 只需交换两个数的位置
if(lastIndex == 1){
if(array[0] > array[1]){
int temp;
temp = array[lastIndex-1];
array[lastIndex-1] = array[lastIndex];
array[lastIndex] = temp;
return array;
}
}
//其他情况: 数组元素在3个以上,
//先将数组中的第一个元素至倒数第二个元素中间的元素(包含第一个元素和倒数第二个元素)进行排序(从小到大),
//然后将最后一个未参与排序的元素(即最后一个元素)插入到此元素前面已经排好序的元素中,
//使得数组依然从小到大
sort(array, lastIndex-1);
//找出第一个大于最后一个元素的元素, 并将其下标记录下来
int flag = -1;
for(int i = 0; i < lastIndex; i++){
if(array[i] > array[lastIndex]){
flag = i; //记录下标
break;
}
}
//如果存在大于最后一个元素的元素, 则将最后一个元素插入到已经排好序的元素中去, 使得数组依然从小到大
if(flag >= 0){
int tempLast = array[lastIndex];
for(int i = lastIndex-1; i >= flag; i--){
array[i+1] = array[i];
}
array[flag] = tempLast;
}
return array;
}
}
程序测试结果如下: