快速排序

1.介绍:快速排序在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

2.思想及步骤:快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)

Step1:在一个数列中找出一个数,作为基数(pivot),在Partition函数中实现。
Step2:已此基数为准,重新排列,把较大的数放在它的右边,较小的数在左边。最终此基数就会排到最终的位置上,它的左右两边为一次分治后的啦两个分区(Partition)。
Step3:递归下去直至数列已排序。

3.代码段:
(1)C++实现

#include<iostream>
using namespace std;
int partition(int *list,int low,int high)
{
  int temp=list[low];
  while(low<high)
  {
    while(low<high && list[high]>=temp) high--;
    list[low]=list[high];
    while(low<high && list[low]<=temp) low++;
    list[high]=list[low];
  }
  list[low]=temp;
  return low;
}

void quick_sort(int *list,int low,int high)
{
  if(low<high)
  {
    //找到基数
    int pivot=partition(list,low,high);
    //递归第一个分区
    quick_sort(list,low,pivot-1);
    //递归第二个分区
    quick_sort(list,pivot+1,high);
  }
}

//test
int main()
{
  int list[9]={1,23,12,45,98,56,34,6,64};
  quick_sort(list,0,8);
  for(int i=0;i<10;++i) cout<<list[i]<<" ";
  return 0;
}

>>>1 6 12 23 34 45 56 64 98 //输出结果

(2)Python实现

#!/bin/python
#coding=utf-8

'''
先通过partition函数找到基数:参数为arr为一个整形数组,low为数组第一个数下标,high为数组最后一个数下标
'''
def partition(arr,low,high):
  temp=arr[low]
  while low < high:
    while low < high and arr[high] >= temp:
      high-=1
    arr[low]=arr[high]
    while low < high and arr[low] <= temp:
      low+=1
    arr[high]=arr[low]

   arr[low]=temp
   return low

'''
快排主函数
'''
def quick_sort(arr,low,high):
  #判断一个入参是否有效
  if arr==[]:
    return -1
  #执行
  if low < high:
    pivot=partition(arr,low,high)
    quick_sort(arr,low,pivot-1)
    quick_sort(arr,pivot+1,high)

#test
arr=[1,23,12,45,98,56,34,6,64]
quick_sort(arr,0,8)
print arr

>>>1, 6, 12, 23, 34, 45, 56, 64, 98  #输出结果

(3)java实现

//定义快排接口
interface QuickSort
{
  public int partition(int arr[],int low,int high);
  public void quick_sort(int arr[],int low,int high);
} 
//test
public class Test implements QuickSort
{
  //实现partition
  public int partition(int[] arr,int low,int high)
  {
    int temp=arr[low];
    while(low<high)
   {
      while(low<high && arr[high]>=temp) high--;
      arr[low]=arr[high];
      while(low<high && arr[low]<=temp) low++;
      arr[high]=arr[low];
    }
    arr[low]=temp;
    return low;
  }
  //快排主体
  public void quick_sort(int[] arr,int low,int high)
  {
    if(low<high)
    {
    //找到基数
    int pivot=partition(arr,low,high);
    //递归第一个分区
    quick_sort(arr,low,pivot-1);
    //递归第二个分区
    quick_sort(arr,pivot+1,high);
    }
  }

   public static void main(String args[])
  {
    int[] arr={1,23,12,45,98,56,34,6,64};
    Test quick=new Test();
    quick.quick_sort(arr,0,8);
    for(int i=0;i<9;++i)
    {
      System.out.println(arr[i]);
    }
  }
}
>>>1,6,12,23,34,45,56,64,98//输出结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值