经典算法之快速排序

说明:

    快速排序是目前公认最快的排序方法之一。大部分情况都表现得很好,但当必须考虑最坏情况时,快速排序不可接受,因为时间达到O(n2)。

 

思路:

    快速排序的基本思想是在数列中找出适当的轴心,将数列分成左右两部分(左半部分的元素都小于右半部分的元素),然后分别对两部分进行排序(重覆选择轴心,划分左右部分的过程)。

    以中间元素为轴(用p表示)进行处理的步骤:

    1、 令索引i从左向右找,直到找到大于p的数。

    2、 令索引j从右向左找,直到找到小于p的数。

    3、 如果i>=j,跳到第五步。

    4、 否则,交换i、j两处元素的值。

    5、 对左边重覆上面的步骤。

    6、 对右边重覆上面的步骤。

 

    注意:轴心的选择对快速排序的效率有影响,但以中间元素为轴心的算法较容易理解。

 

核心代码:

代码
    //以中间元素为轴
    private static void sort2(int[] array, int left, int right) {
        
if (left < right) {
            
int p = array[(left + right) / 2];
            
int i = left - 1;
            
int j = right + 1;
            
while (true) {
                
while (array[++i] < p)
                    ;
                
while (array[--j] > p)
                    ;
                
if (i >= j)
                    
break;
                swap(array, i, j);
            }
            sort(array, left, i 
- 1);
            sort(array, j 
+ 1, right);
        }
    }

 

 

全部代码:

代码
package com.icescut.classic.algorithm.sort;

public class QuickSort {

    
public static void main(String[] args) {
        
int[] array = { 10-3534-34509 }; // test data
        sort2(array, 0, array.length - 1);
        
for (int el : array) {
            System.out.print(el 
+ " ");
        }
    }

    
//以左边元素为轴承
    private static void sort(int[] array, int left, int right) {
        
if (left < right) {
            
int p = array[left];
            
int i = left;
            
int j = right + 1;
            
while (true) {
                
while (i + 1 < array.length && array[++i] < p)
                    ;
                
while (j - 1 > -1 && array[--j] > p)
                    ;
                
if (i >= j)
                    
break;
                swap(array, i, j);
            }
            array[left] 
= array[j];
            array[j] 
= p;
            sort(array, left, j 
- 1);
            sort(array, j 
+ 1, right);
        }
    }
    
    
//以中间元素为轴
    private static void sort2(int[] array, int left, int right) {
        
if (left < right) {
            
int p = array[(left + right) / 2];
            
int i = left - 1;
            
int j = right + 1;
            
while (true) {
                
while (array[++i] < p)
                    ;
                
while (array[--j] > p)
                    ;
                
if (i >= j)
                    
break;
                swap(array, i, j);
            }
            sort(array, left, i 
- 1);
            sort(array, j 
+ 1, right);
        }
    }
    
    
private static void swap(int[] number, int i, int j) {
        
int t = number[i];
        number[i] 
= number[j];
        number[j] 
= t;
    }
}

 

 

posted @ 2009-12-25 08:44  小冰  阅读(442)  评论(0)    收藏  举报