• 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

  • 相关阅读:
    POJ 3041 Asteroids 二分图匹配
    ZOJ 3705 Applications 模拟
    UNIX环境高级编程(第3版)
    明清美文四卷本(共四册)
    卑鄙的圣人:曹操(全10册)
    爱丽丝梦游仙境
    我在大清官场30年
    乌合之众:大众心理研究
    Java多线程编程实战指南
    Linux就该这么学
  • 原文地址:https://www.cnblogs.com/luanxin/p/8882436.html
Copyright © 2020-2023  润新知