昨天晚上在演算編譯堆排序法對結構體一維陣列進行關鍵字排序時候,遇到一些問題,把這些問題總結在這裡,以待參考:
1 堆排序法:堆排序法,就是通過堆這種資料結構來實現排序,演算法複雜度為o(nlogn)。堆是一種完全二叉樹且所有的父節點均大於(或小於)其子節點。堆排序就是將所有待排序的元素組成乙個堆,然後不斷彈出堆頂的元素並呼叫函式維持堆序,直到所有元素均被彈出後,排序完成。被彈出的元素序列即乙個有序數列。
我把修改過程式貼在下面.
#include "stdio.h"
#include "15ikey.c"
main(),,,
,,,,
,,};
heapsort *p[10];
for (i=0; i<=9; i++) p[i]=&stu[i];
printf("\n");
printf("no. name *** age score\n");
for (i=0; i<=9; i++)
printf("%-8d%-9s%-8c%-8d%-5.2f\n",
(*p[i]).num,(*p[i]).name,(*p[i]).***,
(*p[i]).age,(*p[i]).score);
printf("\n");
ikey(p,10,1,8);
printf("no. name *** age score\n");
for (i=0; i<=9; i++)
printf("%-8d%-9s%-8c%-8d%-5.2f\n",
(*p[i]).num,(*p[i]).name,(*p[i]).***,
(*p[i]).age,(*p[i]).score);
printf("\n");
while(1);
}#define key age
#define heapsort struct student
heapsort
stu;
static void ikey(p,n,k,m)
int n,k,m;
heapsort *p;
return;
}static void pisift(p,k,i,l)
int i,l,k;
heapsort *p;
else n=l;
}p[m+k]=w;
return;
}這是倆個檔案。在vs2010下執行通過。
2 編譯中遇到問題。
a: _ikey 已經在 15ikey.obj 中定義。
解決方案:
我在void pisift(p,k,i,l) 前面加上static
b: 「key」的左側部分指定未定義的結構/聯合「student」
這是書中原始碼錯誤
解決方案:#define key age
#define heapsort struct student
heapsort
stu;
還有一些小的語法問題,不一一枚舉。
資料結構定義和演算法 排序
最好情況 最壞情況 平均情況時間複雜度 排序資料量比較小的時候要考慮 係數 常數 低階 比較次數和交換次數 針對排序演算法的空間複雜度,引入原地排序的概念,原地排序演算法就是指空間複雜度為o 1 的排序演算法 排序的序列中存在等值元素,如果經過排序後,相等元素之間原有的順序不變,就說明這個排序演算法...
資料結構定義和演算法 排序 快速排序
如果要排序下標為p到r之間的一組陣列 選擇p到r之間任意乙個元素做pivot 分割槽點 將小於pivot的元素放在左邊,大於pivot的放在右邊,pivot放在中間。這樣陣列就被分為三個部分,小於pivot的區間a p,q 1 等於pivot的區間a q 大於pivot的區間a q 1,r 根據分治...
堆結構 大根堆 堆操作 高階排序演算法 堆排序
堆結構的概念 堆就是乙個陣列,它可以以完全二叉樹的形式表現出來。大根堆 完全二叉樹中每棵子樹的最大值都在頂部就是大根堆 如何實現大根堆?堆操作之heapinsert heapinsert方法來實現將陣列 上浮 調整成大根堆。public static void heapinsert int arr,...