交换排序

一.冒泡排序(稳定)

算法原理

 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)])

 

posted @ 2015-06-17 15:18  Rosanne  阅读(220)  评论(0编辑  收藏  举报