排序方法总结(2)

排序方法总结(2)

先进排序方法

1.快速排序

思路:通过一次排序将待排序列分为两个相邻的区域,其中一个区域的值均小于另外一个区域。再递归进行。

代码实现:

  1. 分区域

    int partion(Elem [] elem, int low, int high){
    Elem key = elem[low];
    while(low < high){
    while(low < high && elem[high] >= key)
    high --;
    elem[low] = elem[high];
    while(low < high && elem[low] <= key)
    low ++;
    elem[high] = elem[low];
    }
    elem[low] = key;
    return low;
    }

  2. 递归

    void quickSort(Elem [] elem, int low, int high){
    int point;
    if(low < high){
    point = partion(elem, low, high);
    quickSort(elem, low, point - 1);
    quickSort(elem, point + 1, high);
    }
    }

复杂度O(nlogn),不是稳定排序方法。

2.归并排序

1.归并两个有序序列

void merge(Elem [] elem, Elem [] tmp, int head, int index, int tail){
	int i, j, k;
	for(i = head, j = index + 1;i <= index && j <= tail;k++){
		if(elem[i] <= elem[j]){
			tmp[k] = elem[i];
			i++;
		}
		else{
			tmp[k] = elem[j];
			j++;
		}
	}
	while(i <= index){
		tmp[k] = elem[i];
		k++;i++;
	}
	while(j <= tail){
		tmp[k] = elem[j];
		k++;j++;
	}
	for(int m = 0;m < elem.length; m++){
		elem[m] = tmp[m];
	}	
}

2.递归

void mergeSort(Elem [] src, Elem [] tmp, int head,int tail){
	int index; 
	if(head < tail){
		index = (head + tail) / 2;
		mergerSort(src, tmp, head, index);
		mergerSort(src, tmp, index + 1, tail);
		merge(src, tmp, head, index, tail);
	}                                                     
}

复杂度O(nlogn),空间复杂度O(1),是稳定的排序方法。

再来讨论下,两种排序的非递归实现:

1.快速排序

思想:将划分后的两个序列的首尾下标入栈,然后循环做。

代码实现:

void quickSort(Elem [] elem, int low, int high){
	Stack<Integer> stack = new Stack<Integer>();
	int point;
	if(low < high){
		point = partion(elem, low, high);
		if(point-1 > low){
			stack.push(low);
			stack.push(point - 1);
		}
		if(point + 1 < high){
			stack.push(point + 1);
			stack.push(high);
		}
	}
	while(!stack.isEmpty()){
		int p = stack.pop();
		int q = stack.pop();
		point = partion(elem, q, p);
		if(point - 1 > q){
			stack.push(q);
			stack.push(point - 1);
		}
		if(point + 1 < p){
			stack.push(point + 1);
			stack.push(p);
		}
	}
}

2.归并排序

思路:先归并2,再归并4,再归并8...

void mergeSort(Elem [] src , Elem [] tmp, int head, int tail){
	int mTail = tail;
	int i = 1; //步长
	while(i < len){
		head = 0;
		while(head + i < mTail){
			int index = head + i - 1;
			tail = index + i;
			if(high > tail) tail = mTail;
			merge(src, tmp, head, index, tail);
			head = tail + 1;
		}
		i = i * 2;
	}
}
posted @ 2016-07-14 18:42  HaoKang  阅读(102)  评论(0)    收藏  举报