1. 程式人生 > >演算法導論 第七章快速排序與隨機快速排序

演算法導論 第七章快速排序與隨機快速排序

view plaincopy to clipboardprint?
#include <iostream>  
#include <cstdlib>  
#include <time.h>  
using namespace std;  
 
void swap(int array[] , int i , int j)  
{  
    if(i!=j)                       //This comparision is most important.  
    {                              //Because function Partition always let its element exchang itself.  
        //cout << array[i] << ' ' << array[j] << endl;  
        array[i] = array[i]+array[j];  
        array[j] = array[i]-array[j];  
        array[i] = array[i]-array[j];  
        //cout << array[i] << ' ' << array[j] << endl;  
    }  
}  
 
int Partition(int array[] , int begin , int end)  
{  
    int sentinel = array[end];  
    int i = begin-1;  
    for(int j=begin ; j<end ; j++)  
    {  
        if(array[j] <= sentinel)  
        {  
            i++;  
            swap(array , i , j);  
        }  
    }  
    swap(array , i+1 , end);  
    return i+1;  
}  
 
void QuickSort(int array[] , int begin , int end)  
{  
    int q;  
    if(begin < end)  
    {  
        q = Partition(array , begin , end);  
        QuickSort(array , begin , q-1);  
        QuickSort(array , q+1 , end);  
    }  
}  
int main()  
{  
    const int n = 10;  
    int a[n];  
    srand(time(0));  
    for(int i=1 ; i<n ; i++)  
    {  
        a[i] = rand()%100;  
    }  
 
    for(int i=1 ; i<n ; i++)  
    {  
        cout << a[i] << ' ';  
    }  
    cout << endl;  
 
    QuickSort(a , 1 , n-1);  
 
    for(int i=1 ; i<n ; i++)  
    {  
        cout << a[i] << ' ';  
    }  
    cout << endl;  
    return 0;  

#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;

void swap(int array[] , int i , int j)
{
    if(i!=j)                       //This comparision is most important.
    {                              //Because function Partition always let its element exchang itself.
        //cout << array[i] << ' ' << array[j] << endl;
        array[i] = array[i]+array[j];
        array[j] = array[i]-array[j];
        array[i] = array[i]-array[j];
        //cout << array[i] << ' ' << array[j] << endl;
    }
}

int Partition(int array[] , int begin , int end)
{
    int sentinel = array[end];
    int i = begin-1;
    for(int j=begin ; j<end ; j++)
    {
        if(array[j] <= sentinel)
        {
            i++;
            swap(array , i , j);
        }
    }
    swap(array , i+1 , end);
    return i+1;
}

void QuickSort(int array[] , int begin , int end)
{
    int q;
    if(begin < end)
    {
        q = Partition(array , begin , end);
        QuickSort(array , begin , q-1);
        QuickSort(array , q+1 , end);
    }
}
int main()
{
    const int n = 10;
    int a[n];
    srand(time(0));
    for(int i=1 ; i<n ; i++)
    {
        a[i] = rand()%100;
    }

    for(int i=1 ; i<n ; i++)
    {
        cout << a[i] << ' ';
    }
    cout << endl;

    QuickSort(a , 1 , n-1);

    for(int i=1 ; i<n ; i++)
    {
        cout << a[i] << ' ';
    }
    cout << endl;
    return 0;
}


以上是演算法導論上的快速排序的實現。

view plaincopy to clipboardprint?
#include <iostream>  
#include <cstdlib>  
#include <time.h>  
using namespace std;  
 
void swap(int array[] , int i , int j)  
{  
    if(i != j)        //This comparision is most important.  
    {               //Because function Partition always let its element exchang itself.  
        array[i] = array[i]+array[j];  
        array[j] = array[i]-array[j];  
        array[i] = array[i]-array[j];  
    }  
}  
 
int Partition(int array[] , int begin , int end)  
{  
 
    int sentinel = array[end];  
    int i = begin-1;  
    for(int j=begin ; j<end ; j++)  
    {  
        if(array[j] <= sentinel)  
        {  
            i++;  
            swap(array , i , j);  
        }  
    }  
    swap(array , i+1 , end);  
    return i+1;  
}  
 
int RandomizedPartition(int array[] , int begin , int end)  
{  
    srand(time(0));  
    int i = rand()%(end-begin+1)+begin;  
    swap(array , i , end);  
    return Partition(array , begin , end);  
}  
void QuickSort(int array[] , int begin , int end)  
{  
    int q;  
    if(begin < end)  
    {  
        q = RandomizedPartition(array , begin , end);  
        QuickSort(array , begin , q-1);  
        QuickSort(array , q+1 , end);  
    }  
}  
int main()  
{  
    const int n = 100;  
    int a[n];  
    srand(time(0));  
    for(int i=1 ; i<n ; i++)  
    {  
        a[i] = rand()%100;  
    }  
 
    for(int i=1 ; i<n ; i++)  
    {  
        cout << a[i] << ' ';  
    }  
    cout << endl;  
 
    QuickSort(a , 1 , n-1);  
 
    for(int i=1 ; i<n ; i++)  
    {  
        cout << a[i] << ' ';  
    }  
    cout << endl;  
    return 0;  

#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;

void swap(int array[] , int i , int j)
{
    if(i != j)        //This comparision is most important.
    {               //Because function Partition always let its element exchang itself.
        array[i] = array[i]+array[j];
        array[j] = array[i]-array[j];
        array[i] = array[i]-array[j];
    }
}

int Partition(int array[] , int begin , int end)
{

    int sentinel = array[end];
    int i = begin-1;
    for(int j=begin ; j<end ; j++)
    {
        if(array[j] <= sentinel)
        {
            i++;
            swap(array , i , j);
        }
    }
    swap(array , i+1 , end);
    return i+1;
}

int RandomizedPartition(int array[] , int begin , int end)
{
    srand(time(0));
    int i = rand()%(end-begin+1)+begin;
    swap(array , i , end);
    return Partition(array , begin , end);
}
void QuickSort(int array[] , int begin , int end)
{
    int q;
    if(begin < end)
    {
        q = RandomizedPartition(array , begin , end);
        QuickSort(array , begin , q-1);
        QuickSort(array , q+1 , end);
    }
}
int main()
{
    const int n = 100;
    int a[n];
    srand(time(0));
    for(int i=1 ; i<n ; i++)
    {
        a[i] = rand()%100;
    }

    for(int i=1 ; i<n ; i++)
    {
        cout << a[i] << ' ';
    }
    cout << endl;

    QuickSort(a , 1 , n-1);

    for(int i=1 ; i<n ; i++)
    {
        cout << a[i] << ' ';
    }
    cout << endl;
    return 0;
}
 

這段程式碼是隨機快排。當資料基本有序,或資料大小相差懸殊時,採用這種演算法。

以上兩種演算法都是遞迴執行的,如果系統棧有限,可以採取非遞迴實現的快排。

非遞迴實現的快排在另一篇博文裡寫過。

發表於 @ 2011年02月19日 10:04:00 | 評論( 0 ) | 編輯| 舉報| 收藏

舊一篇:演算法導論 Exercise 4.2-2
檢視最新精華文章 請訪問部落格首頁相關文章