算法和数据结构(四)--常用算法之快排法

  • 快排法(时间复杂度《算法和数据结构(四)--常用算法之快排法》
  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("")

 

    原文作者:五大常用算法
    原文地址: https://blog.csdn.net/tustzhoujian/article/details/81482912
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞