上周日参加了百度的暑期实习笔试,感觉到自己真的是很水啊,基本上都不会,看来如果自己将来真的想做技术,真的还有太多太多的东西要学。。。
今天有时间就仔细整理了一下那个空间复杂度为O(1)的排序算法的流程,并用javav代码实现了一下。现在贴出来和大家分享一下,如果有什么不合适的地方,还希望大家多提意见。
题目如下:
数组al[0...num-1]可以分为两部分,al[0...mid-1]和al[mid...num-1],并且这两部分都各自有序。请将数组两部分merge(合并),形成一个总体有序的数组,并且要求空间复杂度为O(1)。
实现代码:
public class MergeSort201205 {
public MergeSort201205(){
}
private int[] al;
private int mid;
private int num;
public int getMid() {
return this.mid;
}
public void setMid(int mid) {
this.mid = mid;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public void setAl(int[] al){
this.al = al;
}
public int[] getAl(){
return this.al;
}
public void mergeSort(){
int i = 0;
int j = mid;
//如果al[0~mid-1]是按降序排列,则整体按降序排列
if(al[0] > al[mid-1]){
//使al[mid,num-1]和al[0,mid-1]是一致的排列顺序
if(al[mid] < al[num-1]){
int end = (num - mid)/2;
for(int m = 0; m < end; m++){
int temp = al[num - 1 - m ];
al[num - 1 - m ] = al[mid + m];
al[mid + m] = temp;
}
}
if(al[mid-1] >= al[mid]){
return;
}else{
this.mergeSortDesc(i,j);
}
//如果al[0~mid-1]是按升序排列,则整体按升序排列
}else if(al[0] < al[mid-1]){
//使al[mid,num-1]和al[0,mid-1]是一致的排列顺序
if(al[mid] > al[num-1]){
int end = (num - mid)/2;
for(int m = 0; m < end; m++){
int temp = al[num - 1 - m ];
al[num - 1 - m ] = al[mid + m];
al[mid + m] = temp;
}
}
if(al[mid-1] <= al[mid]){
return;
}else{
this.mergeSortAsc(i,j);
}
}
}
/**
* 整体按降序排列的排序算法
* Author:
* 2012-5-8 下午2:40:09
* @param i
* @param j
* @return void
*/
public void mergeSortDesc(int i,int j){
if((i < this.num) && (j < this.num) && (i < j)){
if(al[i] >= al[j]){
i++;
mergeSortDesc(i,j);
//如果al[i]小于al[j],则把al[j]插入到al[i]前面,
//而al[i]和al[j]之间的元素整体往后搬移一位
}else{
int temp = al[j];
for(int m = j;m > i;m--){
al[m] = al[m-1];
}
al[i] = temp;
i++;
j++;
mergeSortDesc(i,j);
}
}
}
/**
* 整体按升序排列排序的排序算法
* Author:
* 2012-5-8 下午2:39:36
* @param i
* @param j
* @return void
*/
public void mergeSortAsc(int i,int j){
if(i < this.num && j < this.num && i < j){
if(al[i] <= al[j]){
i++;
this.mergeSortAsc(i,j);
//如果al[i]大于al[j],则把al[j]插入到al[i]前面,
//而al[i]和al[j]之间的元素整体往后搬移一位
}else{
int temp = al[j];
for(int m = j;m > i;m--){
al[m] = al[m-1];
}
al[i] = temp;
i++;
j++;
mergeSortAsc(i,j);
}
}
}
}
public class TestMergeSort {
public TestMergeSort() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
MergeSort201205 ms = new MergeSort201205();
int mid = 5;
int num = 10;
int[] al = {2,5,7,9,11,15,13,10,8,7};
ms.setAl(al);
ms.setMid(mid);
ms.setNum(num);
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("begin at:" + df.format(new Date()));
System.out.println(Arrays.toString(al));
ms.mergeSort();
System.out.println("end at:" + df.format(new Date()));
System.out.println(Arrays.toString(al));
}
}