zoukankan      html  css  js  c++  java
  • 排序之快排

    排序之快速排序

    快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。

    步骤

    1.从数列中挑出一个元素,称为 "基准"(pivot)
    2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分割(partition)操作。
    3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。递归到最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递回下去,但是这个演算法总会结束,因为在每次的迭代中,它至少会把一个元素摆到它最终的位置去。

    伪代码

    function quicksort(q)
         var list less, pivotList, greater
         if length(q) ≤ 1 {
             return q
         } else {
             select a pivot value pivot from q
             for each x in q except the pivot element
                 if x < pivot then add x to less
                 if x ≥ pivot then add x to greater
             add pivot to pivotList
             return concatenate(quicksort(less), pivotList, quicksort(greater))
         }
    
    

    c实现

    #include<stdio.h>
    void swap(int *a,int *b)
    {
    	int temp;
    	temp=*a;
    	*a=*b;
    	*b=temp;
    }
    void quicksort(int a[],int left,int right)
    {
        int last,i;
    	int pivot=a[left];
    	if(left>=right)
    	  return;
    	last=left;
    	for(i=left+1;i<=right;i++)
    	  if(pivot>a[i])
    		swap(&a[++last],&a[i]);
    	swap(&a[left],&a[last]);
    	quicksort(a,left,last-1);
    	quicksort(a,last+1,right);
    }
    int main()
    {
    	int i;
    	int a[]={1,5,7,2,4,6,9,8,4,2};
    	quicksort(a,0,9);
    	for(i=1;i<=9;i++)
    	  printf("%d ",a[i]);
    	printf("\n");
    }
    
    
    
  • 相关阅读:
    谈谈 OC 中的内联函数
    Spring 新手教程(二) 生命周期和作用域
    实时竞价(RTB) 介绍(基础篇)
    oracle数据库性能优化方案精髓整理收集回想
    HNU 13411 Reverse a Road II(最大流+BFS)经典
    CSS3主要知识点复习总结+HTML5新增标签
    修改默认MYSQL数据库data存放位置
    mysql状态查看 QPS/TPS/缓存命中率查看
    Mysql5.7.10新加用户
    很靠谱linux常用命令
  • 原文地址:https://www.cnblogs.com/battzion/p/4162065.html
Copyright © 2011-2022 走看看