排序方法总结(2)
排序方法总结(2)
先进排序方法
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;
} -
递归
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;
}
}

浙公网安备 33010602011771号