一直沒有好好的扎扎實實的演算法的基礎,要找工作了,臨時抱下佛腳,順便把學的東西整理下,以應對比較健忘的大腦。。。
廢話不說,直接主題,其實整理這個,借鑑了不少這個blog, 在此再次感謝這個博主,但願有一天,自己也能請博主喝杯咖啡 哈哈~
先從最熟悉的氣泡排序開始吧:
氣泡排序(bubblesort)
氣泡排序也是我接觸到的最早的排序,其基本思想是把陣列中每個元素都看成是有質量的氣泡,每個氣泡的質量就是陣列對應位置的元素的大小。排序的過程就是不停的把質量較輕(元素較小)的氣泡上浮的過程。第一次迴圈最小的元素起泡到第乙個位置,第二次迴圈,次小的元素被放到正確的位置,這樣n-1次迴圈之後,陣列就是有序的了。值得說明的是,氣泡排序是原地排序的過程,即不需要額外的記憶體空間,時間複雜度為o(n^2),且是穩定的排序。
源**:
int bubblesort(int *pdata,int len)} --i;//迴圈結束後i左邊的元素都比鍵值小,而且i右邊的元素(包括i位置元素)都比鍵值大,所以i值減一,同時和鍵值交換
pdata[begining-1]=pdata[i];
pdata[i]=nd;
return i+1;//考慮到陣列下標是從零開始的
}int quicksortrecursion(int *pdata,int begining,int end)
int i=partition(pdata,begining,end);//劃分
quicksortrecursion(pdata,begining,i);//遞迴的排序左半部分
quicksortrecursion(pdata,i+1,end);//遞迴的排序右半部分
return 1;
} int quicksort(int *pdata,int len)
選擇排序(selectsort)
選擇排序的基本思想和氣泡排序有一點像,都是依次選擇最小元素,次小元素…… ,但是和氣泡排序不同的是,氣泡排序發現小的就進行互換,但是選擇排序是直接把小的放到應該出現的位置。選擇排序的過程如下:
n個元素的陣列可以經過n-1趟選擇排序後得到有序的結果:初始狀態:無序區pdata[1,2,...n],有序區間為空。第一趟排序:在無序區pdata[1,2,...n]中選擇最小的元素pdata[k],將他與第乙個元素pdata[1]交換,使得pdata[1...1]和pdata[2,3,...n],分別表示有序區和無序區。每一次迴圈,有序區的長度加一,同時無序區長度減一。這樣n個元素的序列可以通過n-1趟排序得到有序的序列。選擇排序的時間複雜度為o(n^2),是原地排序,且不穩定排序。
int selectsort(int *pdata,int num)堆排序(heapsort)//找到第乙個比key值小的位置
pdata[i+1]=key;//key插入到第i乙個比key小的元素的位置之後
} return 1;
int sortgroup(int *pndata,int nlen,int nbegin,int nstep)
pndata[j]=nstep;
}} }
return 1;
}int shellsort(int *pndata,int nlen)
int nmid=(nbegin+nend)/2;//中間位置
mergerecursion(pdata,nbegin,nmid);//遞迴求解前半部分
mergerecursion(pdata,nmid,nend);//遞迴求解後banbuf
merge(pdata,nbegin,nmid,nend);//組合,歸併求解
return 1;
}int mergesort(int *pdata,int len)
堆的定義
n個關鍵字序列kl,k2,…,kn稱為堆,當且僅當該序列滿足如下性質(簡稱為堆性質):(1) ki≤k2i且ki≤k2i+1 或(2)ki≥k2i且ki≥k2i+1(1≤i≤(n/2) )滿足(1)的叫做最小堆,滿足(2)的稱作最大堆。
堆排序利用了大根堆(或小根堆)堆頂記錄的關鍵字最大(或最小)這一特徵,使得在當前無序區中選取最大(或最小)關鍵字的記錄變得簡單。
(1)用大根堆排序的基本思想
①先將初始檔案r[1..n]建成乙個大根堆,此堆為初始的無序區
②再將關鍵字最大的記錄r[1](即堆頂)和無序區的最後乙個記錄r[n]交換,由此得到新的無序區r[1..n-1]和有序區r[n],且滿足r[1..n-1].keys≤r[n].key
③由於交換後新的根r[1]可能違反堆性質,故應將當前無序區r[1..n-1]調整為堆。然後再次將r[1..n-1]中關鍵字最大的記錄r[1]和該區間的最後乙個記錄r[n-1]交換,由此得到新的無序區r[1..n-2]和有序區r[n-1..n],且仍滿足關係r[1..n-2].keys≤r[n-1..n].keys,同樣要將r[1..n-2]調整為堆。
……直到無序區只有乙個元素為止。
(2)大根堆排序演算法的基本操作:
① 初始化操作:將r[1..n]構造為初始堆;
② 每一趟排序的基本操作:將當前無序區的堆頂記錄r[1]和該區間的最後乙個記錄交換,然後將新的無序區調整為堆(亦稱重建堆)。
注意:①只需做n-1趟排序,選出較大的n-1個關鍵字即可以使得檔案遞增有序。
②用小根堆排序與利用大根堆類似,只不過其排序結果是遞減有序的。堆排序和直接選擇排序相反:在任何時刻,堆排序中無序區總是在有序區之前,且有序區是在原向量的尾部由後往前逐步擴大至整個向量為止。
堆排序是原地進行的,時間複雜度為o(nlog(n)),是不穩定的排序。
void swap(int &i,int &j)}int maxheapify(int *pdata,int npose,int nlen)
else
return 1;
}int buildmaxheap(int *pdata,int nlen)
int heapsort(int *pdata,int nlen)
return 1;
}
C語言實現幾種常見排序演算法
worker.c created on 2010 7 1 author panfei include void swap int x,int y 插入排序 公升序 void insertsort int arr,int size arr j 1 to insert 選擇排序 降序 void sele...
C語言實現幾種常見排序演算法
氣泡排序最好的時間複雜度為 o n 氣泡排序總的平均時間複雜度為 o n 2 氣泡排序演算法的原理如下 1.比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。2.對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。3.針對所有的元素重複以上的步驟,除...
Shell排序演算法及C語言實現
shell排序演算法是d.l.shell於1959年發明的,其基本思想是 先比較距離遠的元素,而不是像簡單交換排序演算法那樣先比較相鄰的元素。這樣可以快速減少大量的無序情況,從而減輕後續的工作。被比較的元素之間的距離逐步減少,直到減少為1,這時排序變成了相鄰元素的互換。該方法實質上是一種分組插入排序...