zoukankan      html  css  js  c++  java
  • 快速排序算法的c++实现

    很早以前看过快排算法觉得自己掌握了,,课今天用的时候发现老出错,认真想想发现自己一直搞错了。。。

    下面先说一下我的想法:

    首先,快排的思想就是

    1. 从数列中挑出一个元素,称为 "基准"(pivot),
    2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
    3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序

    那么这里需要考虑的就是如何进行分区,这个是最重要的,先来看看我的分区的实现:(这里的provit我就不用随机数来实现了,直接选第一个)

    int partition(int array[], int begin, int end) {
    	int index = begin;
    	int proviet = array[begin];
    	swap(array[index], array[end]);//将provit换到最后
    	for(int i = begin; i != end; i++) {//将小于provit的元素放到左边,大的放到右边
    		if (array[i] < proviet)
    			swap(array[index++], array[i]);
    	}
    	swap(array[index], array[end]);
    
    	return index;
    }
    

      首先,将provit移到数组的最后一位,这样在数组分区的时候就不会影响到provit,也就是这句

    swap(array[index], array[end]);
    

    假设我们要分区的数组是6 7 4 3 56 5, 那么到现在数组应该变成这样了 

    然后,就要将除 provit 意外的全部元素进行遍历,此时 index 是 0,i 也从 0 开始。那么因为第一个 5 < 6,所以变成这样

    到第三步,因为7>6, 所以 index 没变,而 i 自增,即这样,那么此时因为 4 < 6, 所以将 4 和 7 交换,变成这样

    下面的一招这个原理即可。那么,到 for 循环完成后,数组变成如下:,这时,因为 index 位的数大于等于 privot, 所以将他们交换,最后达到的效果就是大的全在右边,小的全在左边。

    然后是 quickSort()的内容:

    void quickSort(int array[], int begin, int end) {
    	if (begin >= end)
    		return;
    	int position = partition(array, begin, end);
    	quickSort(array, begin, position - 1);
    	quickSort(array, position + 1, end);	
    }
    

      这里就是用递归的方法将数列分段进行大小分区,这个应该不难理解。因为每一段内部的元素的都比他后面段的所有元素都小,那么排出来的就应该是一个有序列了。

    对于provit的选择,其实没有太多的要求,只是说你用随机数来产生的话更可能得到一个好的 provit 使得分区更好得到更好的速度。因为使用随机数法使得输入数据的次序对算法不产生影响。只有在随机数产生器给出了一个很不巧的排列时,随机化算法的最坏情况性态才会出现。事实上可以证明几乎所有的排列都可使快速排序接近平均情况性态,只有非常少的几个排列才会导致算法的近最坏情况性态。所以一般情况下采用随机数法。

    如果你想用随机数来实现,可以看看这个http://code.wikia.com/wiki/Random_number

  • 相关阅读:
    《Java程序性能优化》之设计优化
    使用Java内存映射(Memory-Mapped Files)处理大文件
    创建型模式之Singleton模式
    Web服务器原理及简单实现
    Web性能测试中的几个关键指标
    SELECT的解析顺序及慢查询优化
    从几个方向进行Web渗透测试
    使用C# (.NET Core) 实现观察者模式 (Observer Pattern) 并介绍 delegate 和 event
    RxJS -- Subscription
    ASP.Net Core项目在Mac上使用Entity Framework Core 2.0进行迁移可能会遇到的一个问题.
  • 原文地址:https://www.cnblogs.com/xiezhw3/p/3439031.html
Copyright © 2011-2022 走看看