![大寫字母后排的解決算法_第1頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/20/076027e1-b56d-4d63-8a1c-18b69a719349/076027e1-b56d-4d63-8a1c-18b69a7193491.gif)
![大寫字母后排的解決算法_第2頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/20/076027e1-b56d-4d63-8a1c-18b69a719349/076027e1-b56d-4d63-8a1c-18b69a7193492.gif)
![大寫字母后排的解決算法_第3頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/20/076027e1-b56d-4d63-8a1c-18b69a719349/076027e1-b56d-4d63-8a1c-18b69a7193493.gif)
![大寫字母后排的解決算法_第4頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/20/076027e1-b56d-4d63-8a1c-18b69a719349/076027e1-b56d-4d63-8a1c-18b69a7193494.gif)
![大寫字母后排的解決算法_第5頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/20/076027e1-b56d-4d63-8a1c-18b69a719349/076027e1-b56d-4d63-8a1c-18b69a7193495.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、一道編程賽題大寫字母后排題目以及要求:把一個(gè)字符串的大寫字母放到字符串的后面,各個(gè)字符的相對(duì)位置不變,不能申請(qǐng)額外的空間。 以下是我的算法:/test_char_exchange.h#ifndef _TEST_EXCHANGE_#define _TEST_EXCHANGE_typedef int (*TFUN)(char*,int,int);int exchange(char*cs,int f,int r);/cs:需要字符串排序的數(shù)組,f,左下表,r:右下標(biāo)int mySort(char*cs,int f,int r);void swap(char*,char*);int test(TFUN
2、 t);/測(cè)試程序int test2();extern long sum;#endif/test_char_exchange.cpp#include"test_char_exchange.h"#include<stdlib.h>#include<stdio.h>#include<math.h>int isup(char c)return c>='A'&&c<='Z'?1:0;void swap(char *c1,char *c2)int t=*c1;*c1=*c2;*c2=t;/
3、csb:e部分翻轉(zhuǎn)void reverse_ex(char*cs,int b,int e)while(b<e)swap(&csb+,&cse-);long sum=0;int exchange(char*cs,int f,int r)/返回大寫字母?jìng)€(gè)數(shù)if(f=r)return isup(csf);while(f<r&&(!isup(csf)f+;if(f=r)return isup(csf);int tr=r;while(r>f&&isup(csr)r-;if(f=r)return isup(csf)+tr-r;int m=(
4、f+r)/2;int k1=exchange(cs,f,m);/前半部分排序int k2=r-m-exchange(cs,m+1,r);/后半部分排序,小寫字母?jìng)€(gè)數(shù)if(k1>0&&k2>0)/如果前半部分有大寫字符串或者后半部分有小寫字符串,則兩者交換位置int b=m-k1+1;/交換起始點(diǎn)int e=m+k2;/交換終點(diǎn)sum+=e-b+1;reverse_ex(cs,b,e);/csb:e翻轉(zhuǎn),前部分是大寫字母,后半部分是小寫字母 reverse_ex(cs,b,b+k2-1);/cs小寫字母翻轉(zhuǎn)reverse_ex(cs,b+k2,e);/cs大寫字母翻轉(zhuǎn)
5、return k1+tr-m-k2;/檢查排序前后元素是否相對(duì)位置保持一致/cs:排序后數(shù)組,cp原數(shù)組/len,字符串長(zhǎng)度,upn,大寫字符個(gè)數(shù)int issorted(char*cs,char*cp,int len,int upn)int p=0;/檢查小寫字母for(int k=0;k<len-upn;k+)while(p<len&&cpp!=csk)p+;if(p=len)return 0;p=0;/檢查大寫字母for(;k<len;k+)while(p<len&&cpp!=csk)p+;if(p=len)return 0;ret
6、urn 1;#define MLEN 1000int test(TFUN t)char csMLEN+1=""char cpMLEN+1;for(int k=0;k<1;k+)/生成一個(gè)隨機(jī)數(shù)組for(int j=0;j<MLEN;j+)int m=rand()%100;if(m>50)csj=m%25+'a'elsecsj=m%25+'A'cpj=csj;printf("n %s n",cs);char c;printf("任意輸入則開始!n");scanf("%c&quo
7、t;,&c);int bg;bg=0;while(!isup(csbg)bg+;int len=(*t)(cs,bg,MLEN-1);int p=0,q=MLEN-1;/檢查是否所有大寫字母都后排while(!isup(csp)&&p<MLEN)p+;while(isup(csq)&&q>=0)q-;if(p-q!=1)return 0;/查看算法的時(shí)間復(fù)雜度,由結(jié)果可以看出復(fù)雜度是O(nlogn)printf("%ld,%lfn",sum,(double)sum/(MLEN*log(MLEN);if(!issorted(
8、cs,cp,MLEN,len)return 0;return 1;/test_ex2.cpp 這是另一個(gè)人給出的算法,就暫時(shí)冒犯一下版權(quán),借用一下哈#include <stdio.h> #include <string.h> #include"test_char_exchange.h" / Author: 397090770 / E-mail:wyphao.2007 / Date: 2012/09/29 /題目以及要求:把一個(gè)字符串的大寫字母放到字符串的后面, /各個(gè)字符的相對(duì)位置不變,不能申請(qǐng)額外的空間。 /判斷是不是大寫字母 int isUppe
9、rAlpha(char c) if(c >= 'A' && c <= 'Z') return 1; return 0; int mySort(char *arr,int bg, int slen) if(arr = NULL | slen <= 0) return 0; int len=slen+1;sum=0; int i = 0, j = 0, k = 0; for(j = len - 1 - i; j >= 0; j-) if(isUpperAlpha(arrj) for(k = j; k < len - i
10、- 1; k+) swap(&arrk, &arrk + 1); sum+=len-i-j; i+; j = len - 1 - i; /遍歷完了字符數(shù)組,但是沒發(fā)現(xiàn)大寫字母,所以沒必要再遍歷下去 if(j = 0 && !isUpperAlpha(arrj) return 0; return 0; 好了,貼了那么多代碼,該看看效果了啊這是1000個(gè)字母的結(jié)果:從上圖可以看到,完成這個(gè)排序用了4655個(gè)單位時(shí)間再來看看10000個(gè)字母的排序結(jié)果咯:哇,這個(gè)字母可是太多了,只好一個(gè)個(gè)張貼了媽呀,終于貼完了,真的是太多了,這個(gè)一萬個(gè)字母真不是蓋的啊,我們看看結(jié)果:用
11、了62478個(gè)單位時(shí)間,和1000個(gè)字母相比,數(shù)量是后者的十倍,而所用時(shí)間,也差不多是十倍,再多十倍的字母,所用時(shí)間也差不多就是十倍,這個(gè)足以說明O(nlogn)和線性相差多接近了。這點(diǎn)時(shí)間,可以說忽略不計(jì),就是轉(zhuǎn)眼間完成。我們?cè)倏纯戳硪粋€(gè)算法這個(gè)算法復(fù)雜度是O(n3),看看所用時(shí)間吧由于這個(gè)復(fù)雜度太高,我們先用100字母試試:嗯,這個(gè)計(jì)算時(shí)間是26420個(gè)單位時(shí)間,這才100個(gè)字母,用的時(shí)間就已經(jīng)不少了,再看看500個(gè)字母吧這時(shí)間就已經(jīng)飆升到5822562個(gè)單位時(shí)間了,可以想象,如果數(shù)量再多點(diǎn),就會(huì)什么結(jié)果了。現(xiàn)在來看看我的算法是怎么做到幾乎線性時(shí)間排序的(實(shí)際上是O(nlogn))思路是這樣的:將一段要排序的字母串分成兩半,分別排序,然后的問題就是如何把這兩半字母串合并起來成為一個(gè)排好序的字母串。其實(shí)這里要做
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 面向未來的學(xué)??萍冀逃A(chǔ)設(shè)施建設(shè)
- 跨學(xué)科教學(xué)對(duì)學(xué)生創(chuàng)新能力的影響研究
- 科技輔助的小學(xué)英語聽說讀寫教學(xué)新模式
- 跨文化背景下的客戶服務(wù)溝通技巧
- 2025年西安電力高等??茖W(xué)校高職單招高職單招英語2016-2024歷年頻考點(diǎn)試題含答案解析
- 2025年紹興職業(yè)技術(shù)學(xué)院高職單招高職單招英語2016-2024歷年頻考點(diǎn)試題含答案解析
- 2025年福建體育職業(yè)技術(shù)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點(diǎn)含答案解析
- 教育領(lǐng)域巡察工作標(biāo)準(zhǔn)化流程解析
- 2025年骨質(zhì)瓷金箔杯盤組項(xiàng)目可行性研究報(bào)告
- 2025年釘角機(jī)項(xiàng)目可行性研究報(bào)告
- SL+575-2012水利水電工程水土保持技術(shù)規(guī)范
- SYT 6968-2021 油氣輸送管道工程水平定向鉆穿越設(shè)計(jì)規(guī)范-PDF解密
- 人美版初中美術(shù)知識(shí)點(diǎn)匯總八年級(jí)全冊(cè)
- 2024年廣東省高三一模高考英語試卷試題答案祥解(含作文范文)
- 迅雷網(wǎng)盤最最最全影視資源-持續(xù)更新7.26
- 普通話培訓(xùn)班合作協(xié)議書
- 《西方思想經(jīng)典》課件
- 中醫(yī)診療設(shè)備種類目錄
- 如何構(gòu)建高效課堂課件
- 徐金桂行政法與行政訴訟法新講義
- GB/T 13234-2018用能單位節(jié)能量計(jì)算方法
評(píng)論
0/150
提交評(píng)論