《數據結構與算法C語言版》胡明 王紅梅 編著 216頁~217頁 始終沒有給出 關鍵碼的定義。而且看書上的了第一插入排序代碼就是錯的,編者估計自己沒有在真機上面運行。還有、、還有、、、
DF26003A-89B3-4414-A8FC-D4D2D3F0855D.png
如果是對算法感興趣:
算法導論 第三版.png
暫且定義:
數組元素在移動時叫做記錄。
數組元素在比較時叫做關鍵碼。
CSDN http://blog.csdn.net/hguisu/article/details/7776068#comments 這位前輩做已經很好了,但是就是沒有說如何計算關鍵碼的比較次數compareCount和記錄的移動次數moveCount?
冒泡排序思路:
每趟排序都是數組中的相鄰兩個元素在比較,
代碼下載地址:
https://github.com/housenkui/BubbleSort
另外本文作者技術水平有限,歡迎大家批評指正!
#import <Foundation/Foundation.h>
//FIXME:這里N不能大于10^6,排序的元素過多,需要使用外排序
#define N 10
//這里傳入數組的首地址 和數組的長度
void BubbleSort(long a[],long n){
//升序排序
long compareCount = 0;
long moveCount = 0;
long temp = 0;
long j = 0;
long i = 0;
for (; i < n-1; i++) {
for (j = 0; j < n-i-1; j++) {
compareCount++;
if (a[j] > a[j+1]) {//關鍵碼的比較 //數組中的值在比較,但是一般不這樣叫,當數組中的值在比較時叫做關鍵碼 YY? 書上就是這么叫的
temp = a[j+1];
a[j+1] = a[j];//記錄的移動 //數組中的值在移動,但是一般不這樣叫,當數組中的值在移動時叫做記錄 YY?書上就是這么叫的
a[j] = temp;
moveCount += 3;
}
}
}
unsigned long sumCount = compareCount+moveCount;
//實際值
float power = log2(sumCount)/log2(N);
//當N = 10^1時 ,power =1.968483
//當N = 10^2時 ,power =2.009225
//當N = 10^3時 ,power =2.009586
//當N = 10^4時 ,power =2.005717
//當N = 10^5時 ,power =2.004560
printf(" \n\n理論值 2 實際值%lf\n\n",power);
}
main函數調用如下:
int main(int argc, const char * argv[]) {
@autoreleasepool {
long Array[N] ={0};
//生成隨機的數組
for (long i = 0; i < N; i++) {
Array[i] =arc4random()%N;
}
BubbleSort(Array,N);
}
return 0;
}