快排算法

    xiaoxiao2025-01-12  8

    今天下午的时候学了查找和排序的题目,由于比较简单,所以早早的完成了,但是我感觉自己对快排算法的理解并不是很透彻,虽然在用的时候,能很快的敲出来。所有在这里从新对快排学习一遍。

    我先敲了一下快排的算法

     

    #include<iostream> using namespace std; void qsort(int a[],int l,int r) //a[]代表无序数组,l代表左边界,r代表右边界 { int x = a[l],i = l,j = r; //i,j一开始分别指向左右边界,并将做边界的数值记录下来 if(l >= r) return ; //当区间只有一个数值时,本身就是有序的,此刻就不需要递归了 while(i != j) { while(i < j && a[j] >= x) j--; //从右边界开始判断,如果大于x值,j往左移,如果遇见小于的话,跳出循环 a[i] = a[j]; //跳出循环后,将后面小于x的值,移动到前面去 while(i < j && a[i] <= x) i++; a[j] = a[i]; } a[i] = x; //当i=j时,将x的值赋值到a[i]上去,这时比x小的都在左边,比x大的都在右边 qsort(a,l,i-1); //从a[i],分开,递归判断左边的数值和右边的数值 qsort(a,i+1,r); } int main(){ int a[100]; int n; cin >> n; for(int i = 0;i < n;i++){ cin >> a[i]; } qsort(a,0,n-1); for(int i = 0;i < n;i++){ cout << a[i] << " "; } return 0; }

    我在代码后面加了一些注释,方便对照相应的代码。

     

    快排算法说白了,就是开始将一组数看做一个大区间,每次从区间的左边取开始的数值记录下来,然后将比x大的数移动到它的右边,比x小的数移动到它的左边,(注意,因为一开始你是从左边记录的x数值的,所以应从后面先判断,就是将while(i < j && a[j] >= x) j--;放在while(i < j && a[i] <= x) i++; 的前面,否则一开始的时候,你会覆盖最后一个数值。)移动完成后,相当于以x值为界,将数组分为两个区间,这时利用递归开始判断左右区间,和上面的思想一样。如果这个过程中,区间只有一个数值,就不需要递归了

     

    转载请注明原文地址: https://ju.6miu.com/read-1295415.html
    最新回复(0)