zoukankan      html  css  js  c++  java
  • 交换排序

    一.冒泡排序(稳定)

    算法原理

     1.首先比较第一个和第二个数据,将其中较小的数据放到第一个位置,较大的放到第二个位置。然后比较第二个和第三个位置,仍将较大的放到后一个位置。以此类推,直到比较第n-1个数据和第n个数据。这样就将待排序序列中的最大的一个放到第n个位置上,这个过程称为一趟排序。
     
    2.对前面n-1个数据重复这个过程,将次大的数据放到第n-1个位置上。一般的,第i趟冒泡排序是对第1到n-i+1个数据进行操作,找到第i大的数据放到数组的第n-i+1位置上。重复,直到i=n-1为止。
    template <typename Comparable>
    void bubbleSort ( vector<Comparable>& a)
     {
         int n = a.size();
          for ( int i = 0; i < n-1; ++i )
         {
             for ( int j = 0; j < n-i-1; ++j )
             {
                 if ( a[j] > a[j+1] )
                {
                    Comparable temp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = a[j];
               }
            }
        }
     }

     优化后,最佳情况下,时间复杂度为O(N)

    template <typename Comparable>
    void bubbleSort ( vector<Comparable>& a)
     {
         int n = a.size();
         bool swap_flag = true;
          for ( int i = 0; i < n-1; ++i )
         {
             swap_flag = false;
             for ( int j = 0; j < n-i-1; ++j )
             {
                 if ( a[j] > a[j+1] )
                {
                    Comparable temp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = a[j];
                    swap_flag = true;
               }
            }
            if swap_flag == false:
                 return;
        }
     }

    二.快速排序(不稳定)

    基本思想
    通过一趟排序将待排序记录分割陈独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
     
    【一趟快速排序】首先任意选取一个记录作为枢轴,然后将所有关键字小于它的记录都安置在它之前,将所有关键字大于它的记录安置在它之后。
    template<typename Compareble>
    void quickSort ( vector<Comparable> & a)
    {
       quickSort( a, 0, a.size()-1);
    }
    
    void quickSort ( vector<Comparable>&a, int low, int high )
    {
        if ( low < high )
       {
            int pivotPos = partition ( a, low, high );
            quickSort ( a, low, pivotPos-1 );
            quickSort ( a, pivotPos+1, high);
       }
    }
    
    int partition (vector<int>& nums, int low, int high)
    {
        int pivot = nums[low];
        while (low < high)
       {
            while (low < high && pivot <= nums[high])
                high--;
           nums[low] = nums[high];
           while (low < high && pivot >= nums[low])
                low++;
            nums[high] = nums[low];
        }
        nums[low] = pivot;
       return low;
    }

    注意:如果第一个while中为(low<=high)则算法将陷入死循环。

    python版本

    def quick_sort(data):
        """快速排序"""
    
        if len(data) < 2:
            return data
    
        low = 0
        high = len(data) - 1
        pivot = data[low]
    
        while low < high:
            while low < high and pivot <= data[high]:
                high -= 1
            data[low] = data[high]
    
            while low < high and pivot >= data[low]:
                low += 1
            data[high] = data[low]
        data[low] = pivot
    
        return quick_sort2(data[0:low]) + [data[low]] + quick_sort2(data[low+1:len(data)])
  • 相关阅读:
    技术收集
    Entity Framework的扩展库
    暂时收集
    php 处理高并发的思路
    nginx缓存优先级(缓存问题者必看)
    mysql5.5主从配置
    php源码编译常见错误解决方案
    今天开始要改变模式了
    nrpe 在ubuntu上安装遇到的问题
    zendstudio 10下载汉化
  • 原文地址:https://www.cnblogs.com/happygirl-zjj/p/4583415.html
Copyright © 2011-2022 走看看