算法和數據結構(四)--經常使用算法之快排法

  • 快排法(時間複雜度O(NlogN)
  1. 選擇基準數,(通常選須要排序數組的第一個元素array[0])
  2. 從右往左找到第一個小於該基準數的值array[j]
  3. 從左往右找到第一個大於該基準值的值array[i]
  4. 交換i、j位置的數值
  5. 重複步驟2-4,直到i==j
  6. 此時i==j,交換基準點和位置i的數值,完成對第一個基準點的歸位
  7. 此時該基準點在位置i處,對位置i左右分別重複1-6步進行快排操做
/* c */
#include<stdio.h>
#include <stdlib.h>
#include <assert.h>
void quickSort(int array[], int left, int right)
{
    assert(array != NULL);
    //對一個數據排序,或者左下標大於有下標時,直接返回
    if(left >= right)
    {
        return;
    }
    //對2個數據排序,排序返回
    int left_index = left+1;
    int right_index = right;
    if(left_index == right_index)
    {
        if(array[left] > array[right])
        {
            int tmp = array[left];
            array[left] = array[right];
            array[right] = tmp;
        }
        return;
    }
    /*對多個數據快排*/
    int key = array[left];
    while(left_index < right_index)
    {
        //從右側找到第一個小於key的值
        for(;right_index != left_index; right_index--)
        {
            if(array[right_index] < key)
            {
                break;
            }
        }
        //從左側找到第一個大於key的值
        for(;left_index != right_index; left_index++)
        {
            if(array[left_index]>key)
            {
                break;
            }
        }
            int tmp = array[left_index];
            array[left_index]  = array[right_index];
            array[right_index] = tmp;
    }
    if(array[left_index]>=key)
	{
		left_index--;
	}
	
    //將第一個基準點正確歸位
    int tmp = array[left];
    array[left] = array[left_index];
    array[left_index] = tmp;
    
    //對該基準點的左右分別進行快排
    quickSort(array, left, left_index);
    quickSort(array, right_index, right);
     
    return;
}
class QuickSort(object):
    def __init__(self,array):
        assert array != None
        self.array = array
    
    def sort(self, left, right):
        '''須要排序數據只有1個,或者left大於right'''
        if left >= right:
            return
        '''須要排序數據有兩個時'''
        left_index = left+1
        right_index = right
        if left_index == right_index:
            if self.array[left] > self.array[right]:
                tmp = self.array[left]
                self.array[left] = self.array[right]
                self.array[right] = tmp
            return
        '''須要排序數據超過3個時'''
        key = self.array[left]
        while left_index < right_index:
            #先從右側查找第一個小於基準值的數值
            while right_index != left_index:
                if self.array[right_index] < key:
                    break
                right_index -= 1
            #從左側找第一個大於基準值的數值
            while left_index != right_index:
                if self.array[left_index] > key:
                    break
                left_index += 1 
            tmp = self.array[left_index]
            self.array[left_index] = self.array[right_index]
            self.array[right_index] = tmp
        
        if array[left_index]>=key:
            left_index -= 1
        #第一個基準點正確歸位
            tmp = self.array[left]
            self.array[left] = self.array[left_index]
            self.array[left_index] = tmp
        #對該基準點左右側分別進行快排
        self.sort(left, left_index)
        self.sort(right_index, right)
            

    def show(self):
        print("Now th array is:"),
        for item in self.array:
            print(item),
        print("")