快速排序算法

       好久没写博客,最近看到一个比较冒泡、选择和快速排序算法效率的代码段,突然想自己写下快速排序,才发现,快速排序代码还不是一下子能写出来的,花了点时间才算完成,故权当记录方便后续查看吧。

一、快速排序原理:快速排序首先是记录一组数据的第一个位置称为低位和最后一个位置称为高位,然后选取一组基础数据中的某一个位置数据做为基准数据(通常是最左边第一个数据),然后从该位置开始的右边的最后一个位置开始由后往前找到第一个小于该基准数据的数,进行交换,并记录该位置,接着从基础数据的第一个位置到记录的位置,从前到后找到第一个大于基准数据的数字,交换,然后把基准数据还原,只要低位小于高位,则不断进行上述循环操作,最后数据被分成三部分,小于基准数据的部分、基准数据和大于基准数据部分,最后对小于基准数据部分和大于基准数据部分再次进行上述递归比较,最后得出的数据就是有序的。

二。快速排序说明

  定义一组数据,  10,25,15,6,17

① 以10为基准数据 ,先将10存在一个变量中, 从高位位置5往前比较找到大于10的数字并交换,此时数据序列为  6,25,15,6,17,高位置变为4

②从低位位置1开始从前往后比较,找到大于10的数,并交换数据,数据序列此时改为6,25,15,25,17,此时低位置为2

③继续①步骤找不到小于10的数,高位置等于2,进行②步骤比较交换数据,数据序列变为6,25,15,25,17,低高位位置相同都为2,即基准点的新位置

④还原基准数据,此时数据序列变为6,10,15,25,17

⑤ 此时基础数据分成了三部分,基准数据、比基准数据小的区域及比基准数据大的区域,然后对除基准数据之外两区域继续执行上述①②③④操作,

  最后数据全部变成有序序列6,10,15,17,25。

三、代码实现

由于目前对pascal语言比较熟,故暂提供pascal版实现,打开delphi开发工具,新建一个控制台应用程序,代码实现如下:

program QuickSort;
{$APPTYPE CONSOLE}


uses
  SysUtils;


  procedure  ShowArray(ar:array of Integer);
  var
    i:integer;
  begin
    for i:=Low(ar) to High(ar) do
     Write(ar[i],' ');
  end;


  procedure QuickSortArr(var arrs:array of integer;left,right:Integer);
  var
    i,j,temp:integer;
  begin
    if left>=right then exit; //左边比右边大或者相等则退出


    i:=left;
    j:=right;
    temp:=arrs[i]; //选择最左边做为基准数
    while i<j do  //左右数指向相同位置则终止循环
    begin
      while (i<j) and (arrs[j]>=temp) do
       Inc(j,-1); //从后面往前找第一个小于基准数的数字位置,给当前最左值
      arrs[i]:=arrs[j];
      while (i<j) and (arrs[i]<=temp) do
       Inc(i,1);  //从前面往后找第一个大于基准数的数字位置,值赋给上面比基准数小位置
      arrs[j]:=arrs[i];
    end;
    arrs[i]:=temp; //把基准数还原
    QuickSortArr(arrs,i+1,right); //基准数右边继续递归排序
    QuickSortArr(arrs,left,i-1);  //基准数左边继续递归排序
  end;
var
  i,n:integer;
  intarr:array of Integer;
begin
  Writeln('输入数组长度');
  Readln(n);
  SetLength(intarr,n);
  Randomize;
  for i:=0 to Length(intarr) do
  begin
    intarr[i]:=Random(50);
  end;
  Writeln('排序前数组');
  ShowArray(intarr);
  readln;
  QuickSortArr(intarr,Low(intarr),High(intarr));
  Writeln('排序后数组');
  ShowArray(intarr);
  readln;
end.


运行效果如下:

  

写到这里基本算是又复习了一遍,算法原理本身不复杂,简单来说就是分区域然后递归调用,但实际写还是不能一步到位,编程还是在于多思考和实践,也希望编程大神们能多多指教。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值