學校練習,簡單的我就不放上來了,值得整理的,我保存一下
習題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程序中任意排序。
在手寫快速排序的時候,我們要注意一點,關於左右值的移動,應該先移動右值,賦值給左,然后再移動左,賦值給右,最后,返回左下標,作為划分點。
我們在了解划分的時候,不能夠忘記一個思想,分冶的思想,這個思想在我們今后會經常能夠用得到。