驗證元素的唯一性(二重循環法和快排優化)


學校練習,簡單的我就不放上來了,值得整理的,我保存一下

習題4

 

1.1.驗證元素唯一性(二重循環)

 

1.1.1.算法描述

 

 驗證元素唯一性,主要方法是:建立兩重循環,進行校驗每個元素和其他元素的

 

1.1.2.偽代碼

 

UniqueElements(A[0..m-1])

//驗證給定數組中的元素是否唯一

//輸入:數組A[0..n-1]

//輸出:如果A中元素全部唯一,返回true

//否則返回false

for i<- 0 to n-2 do

  for j<- i+1 to n-1 do

    if A[i]=a[j] return false

return true

 

1.1.3.算法實現

 

bool UniqueElements(int ele[],int len){

    for(int i=0;i<len-1;i++)

        for(int j=i+1;j<len;j++)

            if(ele[i]==ele[j]) return false;

    return true;

}

 

2.1.算法優化(quick sort 優化)

 

2.1.1.算法描述

 

使用quick sort排序算法進行優化,主要方法是:使用quick sort算法,進行元素排序,再取第一個值。

 

2.1.2驗證元素唯一性(quick sort優化,偽代碼)

 

UniqueElements(A[0..m-1]

//驗證給定數組中元素是否唯一

//輸入:數組A[0..n-1]

//輸出:如果A中元素全部唯一,返回true

//否則返回false

qsort(A)

for i<-0 to len-1 do

  if A[i]=a[i+1] return false

return true

 

2.1.3改進算法實現

 

int cmp(const void *a,const void *b){

    return *(int*)b-*(int*)a;

}

bool UniqueElements(int ele[],int len){

    qsort(ele,len,sizeof(int),cmp);//這個qsort<stdlib.h>中自帶的函數

    for(int i=0;i<len-1;i++)

        if(ele[i]==ele[i+1]) return false;

    return true;

}

 

3.1.快排算法(quick sort)

 

3.1.1.算法描述

 

快排算法,是對冒泡排序的一種改進,在其中,有着分冶的思想。我們取一個base,之后進行左右遞歸排序。在排序過程中,我們從右往左,找到剛好比base小的數字,將右值賦給左值,然后從左往右,找到剛好比base大的數字,將左值給右值,最后兩值相等,我們將base給左值。

 

3.1.2.偽代碼

 

   get_base(ele[0,m-1],left,right)

//獲取划分的目標

//輸入:一個元素,給定一個左值右值作為區間

//輸出:返回划分的索引

base<-ele[left]

while left<right do

  while left<right and ele[right] >= base do

    right--

  end

  while left<right and ele[left] <= base do

    left++

  end

  ele[left]=base

end

return left;

 

quick_sort(ele[0,m-1],left,right)

//進行遞歸排序

//輸入:一個元素,給定一個左值右值作為區間

if left<right do

  index<-getbase(ele,left,right)

  quick_sort(ele,left,right)

  quick_sort(ele,left,right)

end

 

 

3.1.3.實現

 int get_base(int ele[],int left,int right){

    int base=ele[left];

    while(left<right){

        while(left<right && ele[right]>=base) right--;

        ele[left]=ele[right];

        while(left<right && ele[right]<=base) left++;

        ele[right]=ele[left];

    }

    ele[left]=base;

    return left;

}

void quick_sort(int ele[],int left,int right){

    if(left<right){

        int index=get_base(ele,left,right);

        quick_sort(ele,0,index-1);

        quick_sort(ele,index+1,right);

    }

}

4.1.試驗小結

 

在驗證元素唯一性的時候,我們通常的做法是,進行兩重循環,進行兩兩相比較,如果兩兩相同,則返回false,否則返回true,這種算法,時間復雜度為O(n^2),空間復雜度為O(1),所以我們想到了優化方案,使用快排,進行優化,之后依次進行遍歷,即可得到。我們思考一下,在使用快排,我們的時間復雜度為O(nlogn),空間復雜度為O(1)。這個效率明顯比之前的效率優化了太多。

 

快排算法中,我們可以使用C語言<stdlib.h>中自帶的qsort函數,這個函數的原型如下,void qsort( void *buf, size_t num, size_t size, int (*compare)(const void *, const void *) );第一個buf,指的是你的數組,第二個參數size_t指的是一個無符號整型,為你的數組長度,第三個參數為你的數組元素大小,第四個參數為一個void指針,我們在C程序的學習中,知道了,void指針可以指向任意,也可以被任意所指向,所以,我們在定義比較函數cmp的時候,要注意,定義的是const void*的參數類型,之后再強轉為元素指針類型,進行比較,這樣做,能直接將快排算法,適用於整個C程序中任意排序。

 

在手寫快速排序的時候,我們要注意一點,關於左右值的移動,應該先移動右值,賦值給左,然后再移動左,賦值給右,最后,返回左下標,作為划分點。

我們在了解划分的時候,不能夠忘記一個思想,分冶的思想,這個思想在我們今后會經常能夠用得到。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM