這是一個基於控制台菜單的排序算法演示框架,支持插入排序(直接/希爾)、選擇排序(簡單/樹形/堆)、快速排序、歸並排序等多種算法的選擇與展示。雖然核心排序邏輯未填充(僅打印標題),但菜單架構、輸入處理、模塊化設計值得初學者參考。
myprint_0():主菜單顯示myprint_a():插入排序子菜單myprint_c():選擇排序子菜單inputmyprint_1/a/c():對應子菜單的輸入處理與分發採用函數指針/分發表思想的雛形,將菜單顯示、輸入處理、業務邏輯分離。
char Choic = getchar(); // 讀取首字符
// 注意:getchar() 留下換行符,後續 scanf("%c") 會讀到換行符
// 建議:scanf(" %c", &c) 跳過空白字符,或用 getchar() 循環清理緩衝區
main() 缺少返回類型 int(C99 前隱式 int,現代標準必須顯式)printf 邊框代碼,應封裝為 PrintMenu(const char* title, const char* options[])
void InsertSort(int *a, int n) {
for (int i=1; i=0 && a[j] > key) a[j+1] = a[j--];
a[j+1] = key;
}
}
void ShellSort(int *a, int n) {
for (int gap=n/2; gap>0; gap/=2)
for (int i=gap; i=0 && a[j]>key) a[j+gap]=a[j], j-=gap;
a[j+gap]=key;
}
}
void QuickSort(int *a, int l, int r) {
if (l>=r) return;
int i=l, j=r, pivot=a[l];
while (i=pivot) j--;
if (i
void MergeSort(int *a, int l, int r, int *tmp) {
if (l>=r) return;
int mid=(l+r)/2;
MergeSort(a, l, mid, tmp);
MergeSort(a, mid+1, r, tmp);
int i=l, j=mid+1, k=l;
while (i<=mid && j<=r) tmp[k++] = a[i]<=a[j] ? a[i++] : a[j++];
while (i<=mid) tmp[k++] = a[i++];
while (j<=r) tmp[k++] = a[j++];
for (i=l; i<=r; i++) a[i]=tmp[i];
}
typedef void (*SortFunc)(int*, int);
struct MenuItem { char key; const char* desc; SortFunc func; };
void RunMenu(struct MenuItem* items, int count) {
while (1) {
PrintMenu(items, count);
char c = GetChoice();
if (c=='q') break;
for (int i=0; i
這個「敗作」實際是很好的練習項目。通過補全算法、重構菜單系統、添加隨機數據生成、性能計時對比、可視化輸出,可進化為完整的《排序算法教學演示軟件》,極大鞏固算法與工程能力。