算法快速排序(学习笔记)

快速排序的基本思想是将待排数据分而治之;有点像二叉树的思想,从待排数据中选出一个标杆数将比它小的放在左边,比它大的放在右边。然后再分别对左右边做同样的操作。由上可知,快速排序的算法可用递归的实现;

Void CheckandSort(int Array, int low, int heigh)

{

         If (Array == Null || (low >= heigh))

                   Printf(“输入参数错误”);

         Else

                   Recur(Array, low, heigh);

}

void Recur(int Array[], int low, int heigh)//用low指向线性表的最左端,heigh指//向线性表的最右端;

{

       int pivot = 0;

       if (low >= heigh)

              return;

       pivot = Sort(Array, low, heigh);

       Recur(Array,low, pivot - 1);

       Recur(Array, pivot + 1, heigh);

}

//将数据不停的分段,每分一段用Sort函数进行每段的排序,直到最小段、、//Low >= heigh 返回

 

int Sort(int Array[], int low, int heigh) //用low指向线性表的最左端,heigh指

//向线性表的最右端;

{

       int pivot = Array[low]; //将最左边元素作为标杆数

       while(low < heigh)

       {

//****************************************************

              while (low < heigh && Array[heigh] >= pivot)

                     heigh--; //从右边遍历找出比标杆数小的数

              if (low < heigh)

                     Array[low++] = Array[heigh];//如果low < heigh将low++将此数放到//low左边

//从最右边遍历(以heigh为指针)将比标杆数小的数移到low左边,low++

 

 

              while (low < heigh && Array[low] <= pivot)

                     low++;

              if (low < heigh)

                     Array[heigh--] = Array[low];

 

//从最右边遍历(以heigh为指针)将比标杆数小的数移到heigh左边,heigh--

       }

       Array[low] = pivot;//此时low ==  height正好都指向标杆数位置

       return low;

}

//进行每一段的排序

 

 

 

1:关于选取标杆值:一般随机选择标杆值,但是标杆值选择越靠近本组的中间值整个算法效率越高

2:时间复杂度:

1,  首先根据比较的次数若已排好序的数据,用此算法将比较n*(n - 1)/2次;若是每次都能让分组的左右相等,则为n*log2[n]

2,  While(low < heigh && Array[low] <= pivot)

low++; 的汇编指令比

if (low < heigh)

                     Array[heigh--] = Array[low];

少大约3条  故若在移动中不需改变位置的越多速度越快;

 

 

故最快的是已排好序切选取的标杆数为数据的中间位置的数;

而最慢的是顺序刚好与待排顺序相反,而选取的标杆值为2

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值