zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    35 点击全图后发现地图“不见了”
    34 文件地理数据库(GDB)变文件夹了怎么办
    33 ArcToolBox学习系列之数据管理工具箱——投影与变换(Projections and Transformations)未完待续……
    32 ArcToolBox学习系列之数据管理工具箱——属性域(Domains)的两种创建及使用方式
    30 ArcGIS 许可管理器常见问题(持续更新中……)
    算法竞赛入门经典 第三章 简要题解
    SCOI2003 字符串折叠 & NEERC2002 Folding 题解
    Vjios 1617 超级教主
    Codeforces Round #652 题解
    Codeforces Round #655 题解
  • 原文地址:https://www.cnblogs.com/luanxin/p/8882436.html
Copyright © 2011-2022 走看看