No.1.3 排序 - 快速排序
一、作为C++编程小白,有必要简单分析、记录下,快速排序算法的实现,以便后续复习:
#include
int a[101], n; //定义全局变量,并在子函数中使用
void quicksort(int left, int right)
{
int i, j, t, temp;
if (left >= right)
return;
temp = a[left]; //temp中存储基准数
i = left;
j = right;
while(i != j){ //其实应该是 i
while(a[j] >= temp && i
//再从左往右找
while(a[i] <= temp && i
// i,j 找到数组中对应数据时,交换位置
if (i
}
}
//当i=j,即 i/j 相遇时,将基准数归位:left <-> i
a[left] = a[i];
a[i] = temp;
//递归
quicksort(left, i-1);
quicksort(i+1,right);
}
int main(){
int i,j,n;
scanf("%d",&n);
for (i=1; i<=n; i++){
scanf("%d",&a[i]);
}
quicksort(1,n);
for (i=1; i<=n; i++){
printf("%d ",a[i]);
}
return 0;
}
/* quicksort()
1.首先给定参数:列表的左右边缘索引,毕竟你用的列表中那些位置,只有你自己知道;
2.如果 left>right,纯属开个玩笑;
3.如果left < right,对应 while(i!=j),这时候,a[left]为基准数,i,j还没相遇,于是可以直接调换 a[i], a[j]
4.如果left = right,有两种情况:都是为了让基准数归位
a.从right出发的 j 找到了比基准数小的值 a[j],然后 i 还没找到比 temp 大的值就遇到了 j(i++ = j),不好意思了,把 a[i]==a[j]和基准数对调,使之归位
b. j 还没找到比基准数小的值 a[j](此时a[j] > temp),就遇到了 第三步中交换之后的 a[i] (j-- = i),那么不好意思了,还是把a[i]和基准数对调,使之归位(a[i]/a[j--] 比 temp 小)
5.基准数归位以后呢,位置是 a[i],左边是比它小的 (left, i-1),右边是比它大的 (i+1, right),没啥好说的,递归呗
*/
二、稍作修改,引入struct student,即可实现”对学生以分数进行的排名”,太懒了,不写了