摘要: 設(shè)計一個可以存放任何類型變量,可存放大小運行時確定的類似數(shù)組的變量類型-------學(xué)習(xí)c++編程思想Lib.h定義了一些數(shù)據(jù)類型和操作函數(shù)的聲明
/**//*****************************\example c librarypage24 in Thinking in c++array like&nb... 閱讀全文
求解整型數(shù)組長度可以使用sizeof(a)/sizeof(int),當(dāng)今天我編寫插入排序時遇到個問題,代碼如下:
#include
<
iostream
>
using
?
namespace
?std;
int
?insertsort(
int
?a[])

{
????
int
?j,key;
????
for
(
int
?i
=
1
;i
<
sizeof
(a)
/
sizeof
(
int
);i
++
)?
//
這里卻不能正確得到數(shù)組長度,單步執(zhí)行時發(fā)現(xiàn)for循環(huán)未執(zhí)行
????
{
????????key
=
a[i];
????????j
=
i
-
1
;
????????
while
(a[j]
>
key
&&
j
>=
0
)
 ????????
{
???????????a[j
+
1
]
=
a[j];
???????????j
--
;
????????}
????????a[j
+
1
]
=
key;
????}
????
return
(
0
);
}
int
?main()

{???
 ????
int
?a[]
=
{
2
,
6
,
9
,
3
,
5
,
8
,
1
,
6
,
3
,
8
}
;

????insertsort(a);
????
for
(
int
?i
=
0
;i
<
sizeof
(a)
/
sizeof
(
int
);i
++
)??
//
這里可以正確求解數(shù)組長度
????????cout
<<
a[i]
<<
"
??
"
;
????system(
"
pause
"
);
????
return
(
0
);
}
搜集資料得到的答案是,數(shù)組傳入函數(shù)時,傳入的是指針,并不是我想的那樣拷貝副本, 所以此時sizeof(a)/sizeof(int)等于1,條件不符合,跳出循環(huán)。 這里只能添加一個數(shù)組長度的參數(shù):
#include
<
iostream
>
using
?
namespace
?std;
int
?insertsort(
int
?a[],
int
?n)

{
????
int
?j,key;
????
for
(
int
?i
=
1
;i
<
n;i
++
)
 ????
{
????????key
=
a[i];
????????j
=
i
-
1
;
????????
while
(a[j]
>
key
&&
j
>=
0
)
 ????????
{
???????????a[j
+
1
]
=
a[j];
???????????j
--
;
????????}
????????a[j
+
1
]
=
key;
????}
????
return
(
0
);
}
int
?main()

{???
 ????
int
?a[]
=
{
2
,
6
,
9
,
3
,
5
,
8
,
1
,
6
,
3
,
8
}
,n;
????n
=
(
sizeof
(a)
/
sizeof
(
int
));
????insertsort(a,n);
????
for
(
int
?i
=
0
;i
<
n;i
++
)
????????cout
<<
a[i]
<<
"
??
"
;
????system(
"
pause
"
);
????
return
(
0
);
}
不知道各位高手有什么好辦法,小弟謝了! ?????????????
知道的越多就越覺得自己無知,我一直感覺挺有道理的一句話。今天早晨起來莫名其妙想到了這句話,感覺有點怪。這句話可以表述為 越有知就覺得越無知 那么我們這么定義一下 1.有知為q,無知為nq 2.覺得有知p,覺得無知np
那么這句話就是 若q則np,逆否命題是 若p則nq 就是說 越覺得有知就越無知
那么作為一個知道這句話的一個理性人,假設(shè)你學(xué)的很多,就可以得到你自己變的更有知的結(jié)論。那么知道的越多你就越有知,就應(yīng)該覺得自己有知(理性的分析),是成立的 就是若q則p
綜合上述我們得到認(rèn)可的三條簡單表述是: 1. q --> np 2. p --> nq(based on 1,we know 1 is true) 3. q -->p
所以就有 q --> p -->nq ,哇塞,矛盾出現(xiàn)了!
文字表述就是 你越是有知那么你就越是無知(注意這里沒有“覺得”不“覺得”了) 所以從今以后我們可以逍遙了,耶!不用讀書咯!哈,明天出去慶祝一下!
或者用集合的觀點看,假設(shè)存在這樣的說明: 集合P是無知(無知是有知的一種狀態(tài),可以說有知趨于無窮小),集合Q是拓展后的知識即有知,集合U是宇宙知識集合。 那么顯然有P<Q<U
我們就可以想象一個文氏圖,可以用周長L表示感覺無知的程度,用面積表示S表示有知程度,那么就有這樣的表述 S(P)<S(Q)<S(U),呵呵,由于包含關(guān)系這是顯然的,說明學(xué)的越多就越有知
但是感覺有知無知卻不能簡單的說L(P)<L(Q)<L(U),因為雖然是包含關(guān)系但周長說不定是小的長,形狀不同嘛。 由此我們有這樣的結(jié)論:即感覺這個東西比較復(fù)雜,跟知識的多少可能有一定關(guān)系,但至少與知識的構(gòu)成(形狀)肯定有關(guān)系。
???? 合并排序的runningtime是O(nlgn),插入排序為O(n*n),當(dāng)合并排序的劃分到一定程度時可以應(yīng)用插入排序。此時插入排序比合并排序的效率高,所以對合并排序做個修改:n/k 長度為k的子序列用插入法排序。(要確定k的值)
a.證明最壞情況下,n/k個子序列用插入來排序的時間時O(nk). ???插入排序為O(n*n),那么對長度為k的子序列排序為O(k*k),n/k個子序列排序時間和是(n/k)*O(k*k)=O(n*k),得證
b.證明在最壞情況下各子序列可以在O(nlg(n/k))下合并.
c.設(shè)修改后合并算法的時間階為O(nk+nlg(n/k)).請給出最大漸近值k(以O(shè)記號,k是n的函數(shù))使得修改后的算法有和標(biāo)準(zhǔn)合并算法一樣的漸近運行時間
d.k的值在實際中如何確定?
自己錯的程序mergesort放在各個論壇上尋求答案,結(jié)果三天沒人回復(fù)。想來也是高手無暇,菜鳥無語。于是自己靜下心來,仔細(xì)看了一下,還是標(biāo)號弄錯了。既然開了兩個數(shù)組,那么數(shù)據(jù)拷貝進(jìn)去后,標(biāo)號應(yīng)該是當(dāng)前數(shù)組的,結(jié)果用了原來數(shù)組的標(biāo)號,導(dǎo)致錯誤。這是修改后的源碼:
//
mergesort
#include
<
iostream
>
using
?
namespace
?std;


int
?merge(
int
?A[],
int
?p,
int
?q,
int
?r)
{
?
int
?n1
=
q
-
p
+
1
;
?
int
?n2
=
r
-
q;
?
int
*
?L?
=
?
new
?
int
[n1];
?
int
*
?R?
=
?
new
?
int
[n2];
?
for
(
int
?i
=
0
;i
<
n1;
++
i)
??L[i]
=
A[p
+
i];
for
(
int
?j
=
0
;j
<
n2;
++
j)
??R[j]
=
A[q
+
1
+
j];
?i
=
0
;j
=
0
;
?
int
?k
=
p;
 ?
while
(i
<
n1
&&
j
<
n2)
{
 ??
if
(L[i]
<=
R[j])
{A[k
++
]
=
L[i
++
];}
??
else
?
{A[k
++
]
=
R[j
++
];}
?}
?
while
(i
<
n1)
{
??A[k
++
]
=
L[i
++
];}
?
while
(j
<
n2)
{
??A[k
++
]
=
R[j
++
];}
?
return
(
0
);
}
int
?mergesort(
int
?A[],
int
?p,
int
?r)
{
?
int
?q;
 ?
if
(p
<
r)
{
??q
=
(p
+
r)
/
2
;
??mergesort(A,p,q);
??mergesort(A,q
+
1
,r);
??merge(A,p,q,r);
?}
?
return
(
0
);
}
int
?main()
{
 ????
int
?b[
6
]
=
{
11
,
65
,
53
,
78
,
38
,
63
}
;
????mergesort(b,
0
,
5
);
?
for
(
int
?i
=
0
;i
<
6
;
++
i)
??cout
<<
b[i]
<<
'
\t
'
;
?
return
(
0
);
}
小小的錯誤,找了我半天
???? 分治法,顧名思義:切分然后治理,治理就是各個解決問題然后合并整理。遞歸的解決分成n個較小規(guī)模的子問題,然后將各個結(jié)果合并從而解決原來的問題。 DIVIDE:將問題分解成一系列子問題。 CONQUER:遞歸地解決各個子問題,若問題足夠小,則直接解決。 COMBINE:將子問題的結(jié)果合并成原問題的解。 自己編的代碼,結(jié)果又運行不起來:ps:幾經(jīng)修改,看來細(xì)節(jié)問題要注意,簡化推理是個好辦法 //mergesort #include<iostream> using namespace std;
int merge(int*A,int p,int q,int r){ ?int n1=q-p+1; ?int n2=r-q; ?int* L = new int[n1]; ?int* R = new int[n2]; ?for(int i=0;i<n1;++i) ? L[i]=A[p+i]; ?for(int j=0;j<n2;++j) ? R[j]=A[q+1+j]; ?i=0;j=0; ?for(int k=p;k<r;k++){ ? if(L[i]<=R[j]){A[k]=L[i++];} ? else {A[k]=R[j++];} ?} ?return(0); }
int mergesort(int*A,int p,int r){ ?int q; ?if(p<r){ ? q=(p+r)/2; ? mergesort(A,p,q); ? mergesort(A,q+1,r); ? merge(A,p,q,r); ?} ?return(0); }
int main(){ ??? int b[6]={11,65,53,78,38,63}; ??? mergesort(b,0,5); ?for(int i=0;i<6;++i) ? cout<<b[i]<<'\t'; ?return(0); }
以下引用自:gooler的專欄http://blog.csdn.net/Gooler/archive/2006/03/22/632422.aspx有各種排序算法quicksort,heapsort... /* ?* A is an array and p, q, and r are indices numbering elements of the array ?* such that p <= q < r. ?* ?* This procedure assumes that the subarrays A[p. .q] and A[q + 1. .r] are in ?* sorted order. It merges them to form a single sorted subarray that replaces ?* the current subarray A[p. .r]. ?*/ void merge(int A[], int p, int q, int r) { ??? int i, j, k, size; ??? int* B; ??? ??? size = r - p + 1;
??? B = new int[size]; /* temp arry for storing the merge result */ ??? ??? /* initialize B */ ??? for (i = 0; i < size; ++i) { ??? ??? B[i] = 0; ??? }
??? i = p; ??? j = q + 1; ??? k = 0; ??? ??? /* compare and copy the smaller to B */ ??? while (i <= q && j <= r) { ??? ??? if (A[i] < A[j]) { ??? ??? ??? B[k++] = A[i++]; ??? ??? } else { ??? ??? ??? B[k++] = A[j++]; ??? ??? } ??? } ??? ??? /* copy the rest to B */ ??? while (i <= q) { ??? ??? B[k++] = A[i++]; ??? }??? ??? while (j <= r) { ??? ??? B[k++] = A[j++]; ??? } ??? ??? /* replace A[p..r] with B[0..r-p] */ ??? for (i = p, k = 0; i <= r; ++i, ++k) { ??? ??? A[i] = B[k]; ??? }
??? delete[] B; }
/* ?* This procedure sorts the elements in the subarray A[p. .r]. ?* ?* If p >= r, the subarray has at most one element and is therefore ?* already sorted. Otherwise, the divide step simply computes an index ?* q that partitions A[p. .r] into two subarrays: A[p. .q], containing n/2 ?* elements, and A[q + 1. .r], containing n/2 elements. ?*/ void mergeSort(int A[], int p, int r) { ??? if (p >= r) return; ??? ??? int q = (p + r) / 2; ??? ??? mergeSort(A, p, q); ??? mergeSort(A, q + 1, r); ??? merge(A, p, q, r); }
排序選擇何種算法取決于排序元素個數(shù)及已排序的程度以及所使用的存儲設(shè)備 ? A[1..n]含n個元素的數(shù)組? 個數(shù)n=length[A] ? 插入排序--適合少量元素的排序 ?? for j<-- 2 to length[A] ?????? do key<--A[j]? ???????? //將A[j]插入到排好序的序列A[1..j-1] ????????? i<--j-1 ???????? while i>0 and A[i]>key ??????????? do A[i+1]<--A[i] ??????????? i<-- i-1 ???????? A[i-1]<--key
用c++源程序描述: #include<iostream> using namespace std; int insertSort(int*array){ int key,i; for(int j=1;j<6;++j){ ???? key=array[j];? //將第二個開始的元素放入key ????? i=j-1; ????? while(i>=0&&array[i]>key){???? //將大于key的元素至key原本所在位置的所有元素向后移動一個,并覆蓋了key原來的位置 ?????????? array[i+1]=array[i]; ?????????????????? --i; ?????????????????????????????????????????? } ?????? array[i+1]=key;//將key插入到array[i]的位置 ??????????????????????????? } return(0);
}
int main(){ int a[6]={11,65,53,78,38,63}; insertSort(a); for(int i=0;i<6;++i) cout<<a[i]<<'\t'; return(0); }
該方法在算法設(shè)計中叫增量方法Incremental ???????? ??
|
|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
27 | 28 | 29 | 30 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|
公告
失去的和得到的是相等的,
怎么做由你自己選擇。
常用鏈接
留言簿(5)
隨筆分類(34)
隨筆檔案(34)
相冊
Friends
My Blog
NBlog
OpenSource
Philosophy
ProblemSet
SITES
最新隨筆
搜索
積分與排名
最新隨筆
最新評論

閱讀排行榜
評論排行榜
|
|