zoukankan      html  css  js  c++  java
  • 排序算法之快速排序 分类: C/C++ 数据结构与算法 2015-06-30 07:59 95人阅读 评论(0) 收藏

           快速排序将以枢轴为界,将原数组分为两个部分,枢轴以前,值都小于枢轴的值,枢轴以后的值都大于枢轴。
           采用递归的方法,对以枢轴为界的两个子序列进行快速排序,直至子序列长度为1。
           1、快速排序的关键是枢轴的选取,主要有三种方法:1)选取第一个或最后一个作为枢轴值; 2)采用随机数生成器,生成枢轴值的下标;3)取第一个、最后一个、中间三者的中间值作为枢轴值,当数据量比较大的时候,甚至采取九数取中的方式。
           2、快速排序因为要递归,当需要排序的数组量比较小时,使用普通的排序算法效果可能更好,所以排序前可先进行判断,如果子序列长度大于阀值则采用快速排序,否则采用插入排序或选择排序等。

          相较于归并排序和堆排序,快速排序是一种高效而且简单的排序方法。

    int partion(SqList* list, int low, int high)
    {//返回枢轴下标
    	int key = list->data[high];//枢轴值
    	int fast = low;
    	int slow = low;
    	while (fast < high)
    	{
    		if (list->data[fast] < key)
    		{
    			if (slow != fast)
    			{
    				swap(list->data[fast], list->data[slow]);				
    			}
    			fast++;
    			slow++;
    		}
    		else
    		{
    			fast++;
    		}
    	}
    	swap(list->data[slow], list->data[high]);
    	return slow;
    }
    void qsort1(SqList* list,int low,int high)
    {
    	if (low < high)
    	{
    		int index = partion(list,low,high);
    		qsort1(list, low, index - 1);//高低子表都采用递归的方法实现
    		qsort1(list, index + 1, high);
    	}
    }
    
    #define MAX_LENGTH_INSERT_SORT 7//定义插入排序可以接受的最大数组
    void qsort2(SqList* list, int low, int high)
    {
    	if ((high - low) > MAX_LENGTH_INSERT_SORT)
    	{
    		if (low < high)
    		{
    			int index = partion(list, low, high);
    			qsort2(list, low, index - 1);
    			qsort2(list, index + 1, high);
    		}
    	}
    	else
    		InsertSort2(list);
    }
    //只用一次递归,高子表采用迭代的方式,减小了递归的深度。
    void qsort3(SqList* list, int low, int high)
    {
    	if ((high - low) > MAX_LENGTH_INSERT_SORT)
    	{
    		if (low < high)
    		{
    			int index = partion(list, low, high);
    			qsort3(list, low, index - 1);
    			low = index + 1;//高子表不递归,采用迭代
    		}
    	}
    	else
    		InsertSort2(list);//当然,此处不能直接使用,还需要对InsertSort2作一下修改,改成指定下标的形式
    }
    void QuickSort(SqList* list)
    {
    	qsort1(list,0,list->length-1);
    }



  • 相关阅读:
    vue基础04计算属性
    vue基础01条件渲染
    vue基础14vuex
    其他03动态拼接地址,使用本地的图片不显示
    其他05vue中ref
    HTML基础02CSS
    其他12es6...运算符
    其他11依赖注入
    其他07插槽
    其他06js类型判断
  • 原文地址:https://www.cnblogs.com/zclzqbx/p/4687084.html
Copyright © 2011-2022 走看看