排序方法总结(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 stack = new Stack();
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  阅读(110)  评论(0)    收藏  举报