快速排序
实验要求:使用快速排序,输出排序好的序列以及copy的次数、比较的次数
实验说明:因为没有用到swap对数组进行交换,仅仅是对将数字copy到坑位中,所以是copy版本的快速排序。
快速排序的思路
一个数字一个坑位,假设一个有5位数字的数组__34512__,那就是5个坑位。设定第一个数为比较的基准值,所以数组中所有的数字都跟3比较,比3大的就去后面的坑位,比3小的就去前面的坑位。
- 一前一后两个指针,设为a和b,一个指向第一个数字,一个指向最后一个数字。
-
先让指针b移动,如果b指向的数字小于基值,那就将b指向的数字放进a指向的坑里:
这里2<3,所以将2放入第一个坑里;
- 把2放进坑里后,将指针a往后移动一步,指向4:
- 将指针a指向的数字与基值进行比较,4>3所以放到b所指向的坑位:
- 把4放进坑位后,将指针b往前移动一步,指向1:
- 继续步骤2,让指针b指向的1与基值比较,1<3,所以将1放入a在的坑位中:
-
将指针a往后移动一位,让它指向5:
-
将指针a所指数字与基值比较,5>3,所以将5放到b所在的坑位中:
-
将指针b向前移动一位,发现与指针a相遇,将基值3放入ab所指向的坑位中:
-
此时,基值3前面的数都比3小,3后面的数都比3大,第一轮排序完成。接着我们再通过递归排序3左边的数和3右边的数,直到全都要排序的数组只有一位时结束排序。
快排的代码步骤
先找到无序序列中的一个数作为基准点(这里设第一个值为基准点),再设立两个指针,第一个i从前往后移动,第二个指针j从后往前移动:
void quick_sort(int s[],int begin,int end)//begin为第一个数的下标,end为最后一个数的下标
{
int i=begin,j=end;
int x=s[i];//基准点
}
先由j从后往前移动,找比基准值小的数:
当找到比基准值小的数后,将比基准值小的数填充到第i个位置,copy值+1
//从后向前找比x小的数
while (i<j && s[j]>=x) {
j--;
comp++;
}
//找到比x小的数之后
if (i<j) {
s[i]=s