10、快速排序

快速排序算法:
最主要的地方就是确定"枢轴"
假设一个数组:{2,5,6,4,3,8,9,1,7,0}需要排序
我们可以选左边的数或右边的数作为枢轴
排序的时候: 

在左边找一个大的,右边找一个小的,交换位置

第一次:把小于枢轴的数放左边,大的放右边,这里选枢轴为2,
排序完为{1,0,2,4,3,8,9,6,7,5}
              |                
第二次:2的位置固定了,然后以2为分界线
对2的左边:选枢轴,小的放左边,大的放右边,这里选枢轴为1,
排序完为{0,1,2,4,3,8,9,6,7,5}
对2的右边:选枢轴,小的放左边,大的放右边,这里选枢轴为4,
排序完为{0,1,2,3,4,8,9,6,7,5}
            |     |
第三次:1的位置和4的位置也固定了,然后分别以1和4为分界线
1的左边:已经排好。1的右边到2:已经排好
4的左边到2:已经排好;
4的右边:选枢轴,小的放左边,大的放右边,这里选枢轴为8,
排序完为{0,1,2,3,4,7,5,6,8,9}
                       
第四次:
8的左边到4:这里选枢轴为7,
排序完为{0,1,2,3,4,6,5,7,8,9}
8的右边:已排好

第五次:
7的左边到4:这里选枢轴为6,
排序完为{0,1,2,3,4,5,6,7,8,9}
7的右边:已排好

结束

此排序使用递归实现


  1 #include<iostream>
  2 
  3 using namespace std;
  4 int n=0;
  5 //函数模板
  6 template<class T>//对任何数据类型都可以排序
  7 void QuickSort(T *a,const int left,const int right)
  8 {
  9 	if(left<right)
 10 	{
 11 		//选枢轴划分
 12 		int i = left;
 13 		int j = right+1;//表示多加的那个数,能让下面的判断条件简单一些,能提高些速度
 14 		int pivot = a[left];//选左边的为枢轴
 15 
 16 		do{
 17 			do i++;
 18 			while(a[i]<pivot);
 19 			do j--;
 20 			while(a[j]>pivot);//在左边找一个大的,右边找一个小的,交换位置
 21 			if(i<j) swap(a[i],a[j]);
 22 		}while(i<j);
 23 		swap(a[left],a[j]);//把枢轴放到中间去,j为中间
 24 
 25 		n++;
 26 		cout<<""<<n<<"次排序:"<<endl;
 27 		for(int k=0;k<10;k++)
 28 			cout<<a[k]<<" ";
 29 		cout<<endl;
 30 
 31 		QuickSort(a,left,j-1);//左半边
 32 		QuickSort(a,j+1,right);//右半边
 33 
 34 
 35 
 36 	}
 37 }
 38 
 39 
 40 int main()
 41 {
 42 	int k[]={2,5,6,4,3,8,9,1,7,0,9999};//最后一个数不参与排序,故意加的,但要比前面的数大
 43 	QuickSort(k,0,9);//0是左下标,9是右下标
 44 	cout<<"最后结果为:"<<endl;
 45 	for(int i=0;i<10;i++)
 46 		cout<<k[i]<<" ";
 47 	cout<<endl;
 48 	system("pause");
 49 	return 0;
 50 }
 51 
vs1010运行结果:

image

原文地址:https://www.cnblogs.com/luanxin/p/8882436.html