




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、1. 穩(wěn)定性比較插入排序、冒泡排序、二叉樹排序、二路歸并排序及其他線形排序是穩(wěn)定的選擇排序、希爾排序、快速排序、堆排序是不穩(wěn)定的2. 時間復(fù)雜性比較插入排序、冒泡排序、選擇排序的時間復(fù)雜性為0(n2)其它非線形排序的時間復(fù)雜性為 O(nl og2 n)線形排序的時間復(fù)雜性為0( n);3. 輔助空間的比較線形排序、二路歸并排序的輔助空間為 0(n),其它排序的輔助空間為0(1);4. 其它比較插入、冒泡排序的速度較慢,但參加排序的序列局部或整體有序時,這種排序 能達(dá)到較快的速度。反而在這種情況下,快速排序反而慢了。當(dāng)n較小時,對穩(wěn)定性不作要求時宜用選擇排序,對穩(wěn)定性有要求時宜用插入 或冒泡排序
2、。若待排序的記錄的關(guān)鍵字在一個明顯有限范圍內(nèi)時,且空間允許是用桶排序。 當(dāng)n較大時,關(guān)鍵字元素比較隨機(jī),對穩(wěn)定性沒要求宜用快速排序。當(dāng)n較大時,關(guān)鍵字元素可能出現(xiàn)本身是有序的,對穩(wěn)定性有要求時,空間允 許的情況下。宜用歸并排序。當(dāng)n較大時,關(guān)鍵字元素可能出現(xiàn)本身是有序的,對穩(wěn)定性沒有要求時宜用堆 排序。*重溫經(jīng)典排序思想-C語言常用排序全解/*相關(guān)知識介紹(所有定義只為幫助讀者理解相關(guān)概念,并非嚴(yán)格定義):1、穩(wěn)定排序和非穩(wěn)定排序簡單地說就是所有相等的數(shù)經(jīng)過某種排序方法后,仍能保持它們在排序之前的 相對次序,我們就說這種排序方法是穩(wěn)定的。反之,就是非穩(wěn)定的。比如:一組數(shù)排序前是a1,a2,a3
3、,a4,a5,其中a2=a4,經(jīng)過某種排序后為 a1,a2,a4,a3,a5 ,則我們說這種排序是穩(wěn)定的,因為 a2排序前在a4的前面,排序后它還是在a4 的前面。假如變成a1,a4,a2,a3,a5就不是穩(wěn)定的了。2、內(nèi)排序和外排序在排序過程中,所有需要排序的數(shù)都在內(nèi)存,并在內(nèi)存中調(diào)整它們的存儲順序, 稱為內(nèi)排序;在排序過程中,只有部分?jǐn)?shù)被調(diào)入內(nèi)存,并借助內(nèi)存調(diào)整數(shù)在外存中的存放順 序排序方法稱為外排序。3、算法的時間復(fù)雜度和空間復(fù)雜度所謂算法的時間復(fù)雜度,是指執(zhí)行算法所需要的計算工作量。一個算法的空間復(fù)雜度,一般是指執(zhí)行這個算法所需要的內(nèi)存空間。*/*功能:選擇排序輸入:數(shù)組名稱(也就是數(shù)
4、組首地址)、數(shù)組中元素個數(shù)*/*算法思想簡單描述:在要排序的一組數(shù)中,選出最小的一個數(shù)與第一個位置的數(shù)交換; 然后在剩下的數(shù)當(dāng)中再找最小的與第二個位置的數(shù)交換,如此循環(huán) 到倒數(shù)第二個數(shù)和最后一個數(shù)比較為止。選擇排序是不穩(wěn)定的。算法復(fù)雜度0(n 2)-n的平方 */void select_sort(i nt *x, int n)int i, j, min, t;for (i=0; i<n-1; i+) /*要選擇的次數(shù):0n-2 共 n-1 次*/min = i; /*假設(shè)當(dāng)前下標(biāo)為i的數(shù)最小,比較后再調(diào)整*/for (j=i+1; j< n; j+)/*循環(huán)找出最小的數(shù)的下標(biāo)是哪個
5、*/if (*(x+j) < *(x+mi n)min = j; /*如果后面的數(shù)比前面的小,則記下它的下標(biāo)*/if (min != i) /*如果min在循環(huán)中改變了,就需要交換數(shù)據(jù)*/t = *(x+i);*(x+i) = *(x+mi n);*(x+mi n)二 t;/*功能:直接插入排序輸入:數(shù)組名稱(也就是數(shù)組首地址)、數(shù)組中元素個數(shù)*/*算法思想簡單描述:在要排序的一組數(shù)中,假設(shè)前面(n-1) n>=2個數(shù)已經(jīng)是排好順序的,現(xiàn)在要把第n個數(shù)插到前面的有序數(shù)中,使得這 n個數(shù) 也是排好順序的。如此反復(fù)循環(huán),直到全部排好順序。直接插入排序是穩(wěn)定的。算法時間復(fù)雜度0(n 2)
6、-n的平方 */void in sert_sort(i nt *x, int n)int i, j, t;for (i=1; i<n; i+) /*要選擇的次數(shù):1n-1 共 n-1 次*/*暫存下標(biāo)為i的數(shù)。注意:下標(biāo)從1開始,原因就是開始時 第一個數(shù)即下標(biāo)為0的數(shù),前面沒有任何數(shù),單單一個,認(rèn)為 它是排好順序的。*/t=*(x+i);for (j=i-1; j>=0 && t<*(x+j); j-) /*注意:j=i-1,j-,這里就是下標(biāo)為i的數(shù),在它前面有序列中找插入位置。*/*(x+j+1) = *(x+j); /*如果滿足條件就往后挪。最壞的情況就
7、是t比下標(biāo)為0的數(shù)都小,它要放在最前面,j=-1,退出循環(huán)*/*(x+j+1) = t; /* 找到下標(biāo)為i的數(shù)的放置位置*/*功能:冒泡排序輸入:數(shù)組名稱(也就是數(shù)組首地址)、數(shù)組中元素個數(shù)*/*算法思想簡單描述:在要排序的一組數(shù)中,對當(dāng)前還未排好序的范圍內(nèi)的全部數(shù),自上 而下對相鄰的兩個數(shù)依次進(jìn)行比較和調(diào)整,讓較大的數(shù)往下沉,較 小的往上冒。即:每當(dāng)兩相鄰的數(shù)比較后發(fā)現(xiàn)它們的排序與排序要 求相反時,就將它們互換。下面是一種改進(jìn)的冒泡算法,它記錄了每一遍掃描后最后下沉數(shù)的 位置k,這樣可以減少外層循環(huán)掃描的次數(shù)。冒泡排序是穩(wěn)定的。算法時間復(fù)雜度0(n 2)- n的平方*/void bubbl
8、e_sort(i nt *x, int n)int j, k, h, t;for (h=n-1; h>0; h=k) /*for (j=0, k=0; j<h; j+) /*if (*(x+j) > *(x+j+1) /*t = *(x+j);循環(huán)到?jīng)]有比較范圍*/每次預(yù)置k=0,循環(huán)掃描后更新k*/大的放在后面,小的放到前面*/*(x+j) = *(x+j+1);*(x+j+1) = t; /*完成交換 */*/k = j; /*保存最后下沉的位置。這樣k后面的都是排序排好了的/*功能:希爾排序輸入:數(shù)組名稱(也就是數(shù)組首地址)、數(shù)組中元素個數(shù)*/*算法思想簡單描述:在直接
9、插入排序算法中,每次插入一個數(shù),使有序序列只增加1個節(jié)點,并且對插入下一個數(shù)沒有提供任何幫助。如果比較相隔較遠(yuǎn)距離(稱為 增量)的數(shù),使得數(shù)移動時能跨過多個元素,則進(jìn)行一次比較就可能消除 多個元素交換。D.L.shell于1959年在以他名字命名的排序算法中實現(xiàn) 了這一思想。算法先將要排序的一組數(shù)按某個增量 d分成若干組,每組中 記錄的下標(biāo)相差d.對每組中全部元素進(jìn)行排序,然后再用一個較小的增量 對它進(jìn)行,在每組中再進(jìn)行排序。當(dāng)增量減到1時,整個要排序的數(shù)被分成一組,排序完成。下面的函數(shù)是一個希爾排序算法的一個實現(xiàn),初次取序列的一半為增量, 以后每次減半,直到增量為1。希爾排序是不穩(wěn)定的。*/
10、void shell_sort(i nt *x, int n)int h, j, k, t;for (h=n/2; h>0; h=h/2) /*控制增量 */for (j=h; j< n; j+) /*這個實際上就是上面的直接插入排序*/t = *(x+j);for (k=j-h; (k>=0 && t<*(x+k); k-=h)*(x+k+h) = *(x+k);*(x+k+h) = t;/*功能:快速排序輸入:數(shù)組名稱(也就是數(shù)組首地址)、數(shù)組中起止元素的下標(biāo)*/*算法思想簡單描述:快速排序是對冒泡排序的一種本質(zhì)改進(jìn)。它的基本思想是通過一趟 掃描后,
11、使得排序序列的長度能大幅度地減少。在冒泡排序中,一次 掃描只能確保最大數(shù)值的數(shù)移到正確位置,而待排序序列的長度可能只 減少1。快速排序通過一趟掃描,就能確保某個數(shù)(以它為基準(zhǔn)點吧) 的左邊各數(shù)都比它小,右邊各數(shù)都比它大。然后又用同樣的方法處理 它左右兩邊的數(shù),直到基準(zhǔn)點的左右只有一個元素為止。它是由C.A.R.Hoare 于 1962年提出的。顯然快速排序可以用遞歸實現(xiàn),當(dāng)然也可以用?;膺f歸實現(xiàn)。下面的 函數(shù)是用遞歸實現(xiàn)的,有興趣的朋友可以改成非遞歸的。快速排序是不穩(wěn)定的。最理想情況算法時間復(fù)雜度O(nlog2n),最壞0(n2)*/void quick_sort(i nt *x, int
12、low, int high)int i, j, t;if (low < high) /*要排序的元素起止下標(biāo),保證小的放在左邊,大的放在右邊。這里以下標(biāo)為low的元素為基準(zhǔn)點*/i = low;j = high;t = *(x+low); /*暫存基準(zhǔn)點的數(shù)*/while (i<j) /*循環(huán)掃描 */while (i<j && *(x+j)>t) /*在右邊的只要比基準(zhǔn)點大仍放在右邊 */j-; /* 前移一個位置*/if (i<j)*(x+i) = *(x+j); /*上面的循環(huán)退出:即出現(xiàn)比基準(zhǔn)點小的數(shù),替換基準(zhǔn)點的數(shù)*/i+; /* 后移一
13、個位置,并以此為基準(zhǔn)點*/while (i<j && *(x+i)<=t) /*在左邊的只要小于等于基準(zhǔn)點仍放在左邊*/i+; /* 后移一個位置*/if (i<j)*(x+j) = *(x+i); /*上面的循環(huán)退出:即出現(xiàn)比基準(zhǔn)點大的數(shù),放到右邊*/j-; /* 前移一個位置*/*(x+i) = t; /*一遍掃描完后,放到適當(dāng)位置*/quick_sort(x,low,i-1); /*對基準(zhǔn)點左邊的數(shù)再執(zhí)行快速排序*/quick_sort(x,i+1,high); /*對基準(zhǔn)點右邊的數(shù)再執(zhí)行快速排序*/*功能:堆排序輸入:數(shù)組名稱(也就是數(shù)組首地址)、數(shù)組
14、中元素個數(shù)*/*算法思想簡單描述:堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進(jìn)。堆的定義如下:具有n個元素的序列(h1,h2,.,hn),當(dāng)且僅當(dāng)滿足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1)(i=1,2,.,n/2)時稱之為堆。在這里只討論滿足前者條件的堆。由堆的定義可以看出,堆頂元素(即第一個元素)必為最大項。完全二叉樹可 以很直觀地表示堆的結(jié)構(gòu)。堆頂為根,其它為左子樹、右子樹。初始時把要排序的數(shù)的序列看作是一棵順序存儲的二叉樹,調(diào)整它們的存儲順 序,使之成為一個堆,這時堆的根節(jié)點的數(shù)最大。然后將根節(jié)點與堆的最后一個節(jié)占八、交
15、換。然后對前面(n-1)個數(shù)重新調(diào)整使之成為堆。依此類推,直到只有兩個節(jié) 占八、的堆,并對它們作交換,最后得到有 n個節(jié)點的有序序列。從算法描述來看,堆排序需要兩個過程,一是建立堆,二是堆頂與堆的最后一 個元素交換位置。所以堆排序有兩個函數(shù)組成。一是建堆的滲透函數(shù),二是反復(fù)調(diào)用 滲透函數(shù)實現(xiàn)排序的函數(shù)。堆排序是不穩(wěn)定的。算法時間復(fù)雜度 O(nlog2n)。*/*功能:滲透建堆輸入:數(shù)組名稱(也就是數(shù)組首地址)、參與建堆元素的個數(shù)、從第幾個元素 開始*/void sift(i nt *x, int n, int s)int t, k, j;t = *(x+s); /*暫存開始元素*/k = s;
16、 /*開始元素下標(biāo)*/j = 2*k + 1; /*右子樹元素下標(biāo)*/while (j<n)if (j<n-1 && *(x+j) < *(x+j+1)/*判斷是否滿足堆的條件:滿足就繼續(xù)下一輪比較,否則調(diào)整。*/j+;if (t<*(x+j) /*調(diào)整 */*(x+k) = *(x+j);k = j; /* 調(diào)整后,開始元素也隨之調(diào)整*/j = 2*k + 1;else /* 沒有需要調(diào)整了,已經(jīng)是個堆了,退出循環(huán)。 */break;*(x+k) = t; /*開始元素放到它正確位置*/*功能:堆排序輸入:數(shù)組名稱(也就是數(shù)組首地址)、數(shù)組中元素個數(shù)*
17、/void heap_sort(i nt *x, int n)int i, k, t;int *p;for (i=n/2-1; i>=0; i-)sift(x,n,i); /*初始建堆 */for (k=n-1; k>=1; k-)t = *(x+0); /* 堆頂放到最后*/*(x+0) = *(x+k);*(x+k) = t;sift(x,k,0); /*剩下的數(shù)再建堆*/void mai n()#defi ne MAX 4int *p, i, aMAX;/*錄入測試數(shù)據(jù)*/p = a;printf("Input %d number for sorting :n&qu
18、ot;,MAX);for (i=0; i<MAX; i+)sca nf("%d",p+);prin tf("n");/*測試選擇排序*/p = a;select_sort(p,MAX);/*/*測試直接插入排序*/* p = a;in sert_sort(p,MAX);*/*測試冒泡排序*/*p = a;in sert_sort(p,MAX);*/*測試快速排序*/*p = a;quick_sort(p,0,MAX-1);*/*測試堆排序*/*p = a;heap_sort(p,MAX);*/for (p=a, i=0; i<MAX; i+)
19、printf("%d ",*p+);prin tf("n");system("pause");4irLCl.d& tlnclu-dle include用C語言實現(xiàn)單向鏈表的直接插入排序,冒泡排序和選擇排序<sr.dio Qot-ririg. h><t-d_iE.e. h>tyi)-e de f 2匸 TMt _node int value;3tr*ct _ode *nsxt; Nad亡T;衛(wèi)亡;Me deTyp 皀 *-gMode = UULLrvoid. W0delnit;(vole)in.v i;N
20、acLeTiTie *node - NULL;ade = (Nodervpe *>italloc(si zeof (NcdeType); if (HULL = node) prinr-f (1,f-iiled:'' rjr"J rhretur-n :nod 已一 Ara. _ 隹亡=rand (%:ods->next NULL;if (?Node) node*>next: = gNcde;JgMods = node;void NodePxinr(void)NodeType *node = gNode;while (node) pxintf(n n t
21、 node->value); node node>nux匕; printf (nnn);void NodeInsertSortV2(void)HNodeType *nexu/ *head., node, *prev;node = (NodeType *) ma Hoc (si zeof (NodeType ; IX (HULL = node) re turn.;node->nexr gNode;head = node;node = head->next->next;head->nex-t->next = NULL;while (node) next =
22、 node->next;node->value) prev = head;while (prev->next && prev->next->value <prev = prev->next;F |)node->next = prev-xiext;pxev->next = node;node = next;gNode = ?iead->next; free (head);void NodeBubb"So工22 (void)5(NodeType *next, *tail r *headz *nocLe:node
23、= (NodeType *)ir:alloc (sizeof (NodeTe); if (NULL = node) return;nocie->nexc = gNod亡;head = node;tail = NULL;while (匸all != head->nexr->next) node = headnext = node->next; next->next->next.; node->next->next = next;I node n node->nexr;next = node->nexr;I Cail = next;JgN
24、ode = head->next;free(head);void Node5elecu5ortV2(void)(ModeType *headr *node r *list r *prev r *ru.n r *next;node = (NodeType *>malloc (sizeof (NodeT-pe);i f (NULL = node> return;node->nex匸=gNode;head = node;Ixsc = head;node = 113C->nexc;whi Le (node->nexc> next prev min node;w
25、hile (nexc->nexc)(if (nexc->nexE->value < min->value) prev = next;min = nexc->nexc;nexcnext->next;if (nixn != ncde> ( li5U->nexc = min; list: = m±n; prev->next = node; prev node;node = node->n皂xc; min min->nexe; lisc->nexc = node; prev->next = min; else
26、 Lis七=list->next; node lisc->nexc;gNode = head->nexc; free(head);vaici He deEHKfi*«ade = NULL;q while (gNode= gNcde->n&xt/ free(gWcde)? qflad& = node;int ir in (void)3(NVLL) > ;ITodeImt :Hade Prin匸()/ /N'ad.elnsertSotvi();J i tfo d.eInBertSortV2 O'/trod.e3uLbleSor
27、EV2 0 ;ITaAaS&lecr.SccV2 ( *TTodeFrint ();ITq de rre ):return ;具體細(xì)節(jié)上有問題,提供一個思路時間問題沒有調(diào)試通過,如果你覺得不行,當(dāng)我沒回答#in clude<iostream>using n amespace std;struct nodeint value;struct node *n ext;;struct linkstruct node *head;int len gth;void show(struct node *head);void selectsort(struct no de*head);vo
28、id in sertsort(struct no de*head);void bubblesort(struct no de*head);struct no de* deleti on( struct no de*head, int n);void in sert(struct no de*head, int n, struct node *q);void mai n()struct li nk *Li nk;struct n ode *Node=Li nk->head=NULL;Lin k->le ngth=O;for(i nt i=0;i<5;i+)Node->va
29、lue=i; Node=Node->n ext;in sertsort(L in k->head);show(L in k->head);bubblesort(L in k->head);show(L in k->head);selectsort(L in k->head); show(L in k->head);void bubblesort(struct no de*head)struct node *p=head;struct node *q=NULL;struct node *s=head;for(i nt j=1;s-> next!=NULL;j+)p=s;for(int i=1;p->next!=NULL;i+)if(p->n ext->value>p->value)q=deletio n( head,i); in sert(head, i-1, q); p=p->n ext;s=s->n ext;void in sertsort(struct no de*head)s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小鹿斑比成長之旅解讀
- 家庭農(nóng)場養(yǎng)殖技術(shù)推廣協(xié)議
- 時尚潮玩商品網(wǎng)絡(luò)銷售合作權(quán)責(zé)共擔(dān)協(xié)議
- 昆蟲記選讀教學(xué)教案:初中生物與自然知識結(jié)合學(xué)習(xí)指導(dǎo)
- 應(yīng)對項目管理中的風(fēng)險應(yīng)對策略
- 海底兩萬里的冒險之旅教案設(shè)計
- 養(yǎng)老服務(wù)機(jī)構(gòu)投資建設(shè)合同
- 高端設(shè)備采購與維護(hù)合同
- 花木蘭報國傳奇故事解讀
- 租賃戶外場地合同協(xié)議書
- 北師大版小學(xué)英語3-6年級單詞-(三起)帶音標(biāo)-精華版
- 《鐵道工程(A)》課程大綱
- 鼻飼老年人進(jìn)食照護(hù)-鼻飼的定義和適應(yīng)人群
- 正紅小學(xué)家長學(xué)校家校聯(lián)系制度
- R1快開門式壓力容器操作試題及答案
- 2022-2023學(xué)年道德與法治小學(xué)四年級下冊全冊單元復(fù)習(xí)課教案(共4個單元)
- 機(jī)動車檢驗檢測機(jī)構(gòu)培訓(xùn)試題及答案
- 全國優(yōu)質(zhì)課一等獎小學(xué)英語人教PEP(三起)六年級下冊《Unit2 Last weekend第3課時》精美課件
- 配位化學(xué)-本科生版智慧樹知到答案章節(jié)測試2023年蘭州大學(xué)
- 學(xué)前教育基礎(chǔ)綜合(教育學(xué))考試復(fù)習(xí)題庫及答案
- 精選湖北省武漢市2023屆高三畢業(yè)生二月調(diào)研測試英語試題
評論
0/150
提交評論