算法学习之路(2)——快速排序
快速排序的基本思想:
1)对任意给定的序列中元素Rs(关键字为Ks),经过一趟排序后,将原序列分割成两个子序列:
2)前一个子序列中的所有元素的关键字均小于等于Ks ,
3)后一个子序列中元素的关键字均大于等于Ks。
4)称元素Rs 为分割元素
5)以后只需对2个子序列分别以同样的算法进行快速排序,直到子序列为空或只有一个元素时得到有序序列。
算法可以用递归来实现。
a) i从左向右找第1个大于等于分割元素的元素。
b) j从右向左找第1个小于或等于分割元素的元素。
c) i<j时,a[i]、a[j]交换;继续扫描,当i>=j时,此趟排序结束
本质上:大的元素调整到右边,小的元素调整到左边
算法实现:
(1)定义一个快排函数quicksort;
函数声明:
void quicksort(int* source,int left,int right);
@param source 源数组
@param left 数组起始索引
@param right 数组末端索引
函数实现:
void quicksort(int* source,int left,int right){ if(left<right){ int i = left; int j = right + 1; //A[left]为分割元素 do{ do{ i++; }while(i < right && source[left]>source[i]);//i从左向右找第1个大于或等于分割元素的元素 do{ j--; }while(j > left && source[left]<source[j]);//j从右向左找第1个小于或等于分割元素的元素 if(i<j){ swap(source[i],source[j]); } }while(i<j);//i<j时,继续扫描,i>=j时,此趟排序结束 swap(source[left],source[j]); quicksort(source,left,j-1);//对分割元素左端序列快速排序 quicksort(source,j+1,right);//对分割元素右端序列快速排序 } }
(2)调用quicksort
函数声明:
void quicksort(int* source,int length);
@param source 源数组
@param length 数组长度
函数实现:
void quicksort(int* source,int length){ quicksort(source,0,length-1); }
实验
测试代码:
int main(){ int* a = new int[20]{ 1, 5, 2, 3, 6, 43, 7, 2, 7, 5, 87, 65, 32, 45, 12, 64, 31, 33, 22, 6 }; quicksort(a,20); for (int i = 0; i < 20; i++){ cout << a[i] << " "; }
delete [] a; }
实验结果: