酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

数据结构课程设计任务书20 题目:内部排序算法比较 题目描述: 对以下六种常用内部排序算法进行性能比较: 直接插入排序、希尔排序、冒泡排序、快速排序、归并排序、简单选择排序。 设计要求: 1.测试数据随机产生。 2.每组测试数据的表长不小于 60。 3.测试数据不少于5组。 4.比较的性能指标包括:排序趟数、关键字比较次数和元素移动次数(元素交换计为3次移动)。 5.要求通过菜单选择排序算法及排序要求(升序/降序)。 6.排序算法结束后需要输出排序的结果、排序趟数、关键字比较次数及元素移动次数。 (要求:程序完整可运行,可以循环进行各种算法的性能演示,运用c语言数据结构的知识)

以下是一个使用 C 语言实现的内部排序算法比较的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> // 交换两个元素 void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } // 打印数组 void printArray(int arr[], int size) { for (int i = 0; i < size; i++) printf("%d ", arr[i]); printf("\n"); } // 直接插入排序 void insertionSort(int arr[], int n) { int i, key, j; int comparisons = 0, moves = 0; for (i = 1; i < n; i++) { key = arr[i]; j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j = j - 1; comparisons++; moves++; } arr[j + 1] = key; moves++; } printf("直接插入排序结果: "); printArray(arr, n); printf("排序趟数: %d\n", i - 1); printf("关键字比较次数: %d\n", comparisons); printf("元素移动次数: %d\n", moves); } // 希尔排序 void shellSort(int arr[], int n) { int comparisons = 0, moves = 0; for (int gap = n / 2; gap > 0; gap /= 2) { for (int i = gap; i < n; i++) { int temp = arr[i]; int j; for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) { arr[j] = arr[j - gap]; comparisons++; moves++; } arr[j] = temp; moves++; } } printf("希尔排序结果: "); printArray(arr, n); printf("排序趟数: 不确定\n"); printf("关键字比较次数: %d\n", comparisons); printf("元素移动次数: %d\n", moves); } // 冒泡排序 void bubbleSort(int arr[], int n) { int comparisons = 0, moves = 0; int swapped; for (int i = 0; i < n - 1; i++) { swapped = 0; for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { swap(&arr[j], &arr[j + 1]); swapped = 1; comparisons++; moves += 3; } } if (swapped == 0) break; } printf("冒泡排序结果: "); printArray(arr, n); printf("排序趟数: %d\n", i + 1); printf("关键字比较次数: %d\n", comparisons); printf("元素移动次数: %d\n", moves); } // 快速排序 void quickSort(int arr[], int low, int high) { int comparisons = 0, moves = 0; if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } printf("快速排序结果: "); printArray(arr, high + 1); printf("排序趟数: 不确定\n"); printf("关键字比较次数: %d\n", comparisons); printf("元素移动次数: %d\n", moves); } int partition(int arr[], int low, int high) { int pivot = arr[high]; int i = (low - 1); for (int j = low; j <= high - 1; j++) { if (arr[j] <= pivot) { i++; swap(&arr[i], &arr[j]); comparisons++; moves += 3; } } swap(&arr[i + 1], &arr[high]); moves += 3; return (i + 1); } // 归并排序 void merge(int arr[], int l, int m, int r) { int n1 = m - l + 1; int n2 = r - m; int L[n1], R[n2]; for (int i = 0; i < n1; i++) L[i] = arr[l + i]; for (int j = 0; j < n2; j++) R[j] = arr[m + 1 + j]; int i = 0, j = 0, k = l; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k++] = L[i++]; } else { arr[k++] = R[j++]; } } while (i < n1) { arr[k++] = L[i++]; } while (j < n2) { arr[k++] = R[j++]; } } void mergeSort(int arr[], int l, int r) { int comparisons = 0, moves = 0; if (l < r) { int m = l + (r - l) / 2; mergeSort(arr, l, m); mergeSort(arr, m + 1, r); merge(arr, l, m, r); } printf("归并排序结果: "); printArray(arr, r + 1); printf("排序趟数: 不确定\n"); printf("关键字比较次数: %d\n", comparisons); printf("元素移动次数: %d\n", moves); } // 简单选择排序 void selectionSort(int arr[], int n) { int comparisons = 0, moves = 0; int i, j, min_idx; for (i = 0; i < n - 1; i++) { min_idx = i; for (j = i + 1; j < n; j++) { if (arr[j] < arr[min_idx]) min_idx = j; comparisons++; } if (min_idx!= i) { swap(&arr[i], &arr[min_idx]); moves += 3; } } printf("简单选择排序结果: "); printArray(arr, n); printf("排序趟数: %d\n", n - 1); printf("关键字比较次数: %d\n", comparisons); printf("元素移动次数: %d\n", moves); } // 生成随机测试数据 void generateRandomData(int arr[], int n) { srand(time(NULL)); for (int i = 0; i < n; i++) arr[i] = rand() % 1000; } int main() { int choice, n = 60, arr[1000]; int ascending = 1; generateRandomData(arr, n); printf("请选择排序算法:\n"); printf("1. 直接插入排序\n"); printf("2. 希尔排序\n"); printf("3. 冒泡排序\n"); printf("4. 快速排序\n"); printf("5. 归并排序\n"); printf("6. 简单选择排序\n"); scanf("%d", &choice); printf("请选择排序顺序(1. 升序 2. 降序): "); scanf("%d", &ascending); switch (choice) { case 1: if (ascending == 1) insertionSort(arr, n); else { for (int i = 0; i < n / 2; i++) swap(&arr[i], &arr[n - i - 1]); insertionSort(arr, n); } break; case 2: if (ascending == 1) shellSort(arr, n); else { for (int i = 0; i < n / 2; i++) swap(&arr[i], &arr[n - i - 1]); shellSort(arr, n); } break; case 3: if (ascending == 1) bubbleSort(arr, n); else { for (int i = 0; i < n / 2; i++) swap(&arr[i], &arr[n - i - 1]); bubbleSort(arr, n); } break; case 4: if (ascending == 1) quickSort(arr, 0, n - 1); else { for (int i = 0; i < n / 2; i++) swap(&arr[i], &arr[n - i - 1]); quickSort(arr, 0, n - 1); } break; case 5: if (ascending == 1) mergeSort(arr, 0, n - 1); else { for (int i = 0; i < n / 2; i++) swap(&arr[i], &arr[n - i - 1]); mergeSort(arr, 0, n - 1); } break; case 6: if (ascending == 1) selectionSort(arr, n); else { for (int i = 0; i < n / 2; i++) swap(&arr[i], &arr[n - i - 1]); selectionSort(arr, n); } break; default: printf("无效的选择\n"); } return 0; } ``` 额外注意点: 1. 注意边界情况的处理,比如数组为空或长度为 1 时的情况。 2. 对于性能指标的计算,要确保准确无误。 3. 代码中的随机数生成可能存在一定的重复性,可考虑更复杂的随机数生成方式。 [2025-01-17 08:36:58 | AI写代码神器 | 2449点数解答]

相关提问