本文共 2775 字,大约阅读时间需要 9 分钟。
插入排序、希尔排序、选择排序和计数排序是四种常见的排序算法,每种算法都有其独特的实现原理、优缺点和应用场景。本文将详细分析这四种排序算法的实现方法及其特性。
插入排序是一种简单且有效的排序算法,其核心思想是将数组视为有序和无序两部分。每次从无序部分中选择一个元素并将其插入有序部分中。以下是插入排序的实现代码:
void InsertSort(int *arr, int size) { for (int i = 0; i < size - 1; i++) { int end = i; int key = arr[end + 1]; while (end >= 0 && arr[end] > key) { arr[end + 1] = arr[end]; end--; } arr[end + 1] = key; }} 特性分析:
希尔排序是对插入排序的优化,通过增加插入间隔(gap)来提高数组的有序程度,从而提升排序效率。希尔排序的实现代码如下:
void ShellSort(int *arr, int size) { int gap = size; while (gap > 1) { gap = gap / 2; for (int i = 0; i < size - gap; i++) { int end = i; int key = arr[end + gap]; while (end >= 0 && arr[end] > key) { arr[end + gap] = arr[end]; end -= gap; } arr[end + gap] = key; } }} 特性分析:
选择排序通过不断地选取数组中的最大值和最小值,分别放在数组的两端来实现排序。其实现代码如下:
void Swap(int *arr, int sub1, int sub2) { int temp = arr[sub1]; arr[sub1] = arr[sub2]; arr[sub2] = temp;}void SelectSort(int *arr, int size) { int begin = 0; int end = size - 1; while (begin < end) { int min = begin; int max = end; for (int i = begin; i <= end; i++) { if (arr[i] < arr[min]) { min = i; } if (arr[i] > arr[max]) { max = i; } } Swap(arr, begin, min); if (max == begin) { max = min; } Swap(arr, end, max); begin++; end--; }} 特性分析:
计数排序通过统计数组中每个元素的出现次数来实现排序。其实现代码如下:
void CountSort(int *arr, int size) { assert(arr); int max = arr[0]; int min = arr[0]; for (int i = 0; i < size; i++) { if (arr[i] > max) { max = arr[i]; } if (arr[i] < min) { min = arr[i]; } } int *temp = (int *)malloc(sizeof(int) * (max - min + 1)); memset(temp, 0, sizeof(int) * (max - min + 1)); for (int i = 0; i < size; i++) { temp[arr[i] - min]++; } int sub = 0; for (int i = 0; i < max - min + 1; i++) { while (temp[i]) { arr[sub++] = i + min; temp[i]--; } } free(temp);} 特性分析:
转载地址:http://vmse.baihongyu.com/