常見排序演算法總結及C語言實現

2022-09-04 01:36:09 字數 3048 閱讀 6897

一直沒有好好的扎扎實實的演算法的基礎,要找工作了,臨時抱下佛腳,順便把學的東西整理下,以應對比較健忘的大腦。。。

廢話不說,直接主題,其實整理這個,借鑑了不少這個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)

//找到第乙個比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)

堆排序(heapsort)

堆的定義

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,這時排序變成了相鄰元素的互換。該方法實質上是一種分組插入排序...