在C语言中,非递归排序的方法有很多种,这里我将介绍两种常见的非递归排序算法:冒泡排序和归并排序。
冒泡排序
冒泡排序是一种简单的排序算法,它通过多次比较相邻的两个元素,并在必要时交换它们的位置来进行排序。以下是冒泡排序的非递归实现:
```c
include
void bubble_sort(int array[], int length) {
int inner = 0, outer = 0;
int temp = 0;
if (NULL == array || 0 == length) return;
for (outer = length - 1; outer >= 1; outer--) {
for (inner = 0; inner < length - outer; inner++) {
if (array[inner] > array[inner + 1]) {
temp = array[inner];
array[inner] = array[inner + 1];
array[inner + 1] = temp;
}
}
}
}
int main() {
int array[] = {64, 34, 25, 12, 22, 11, 90};
int length = sizeof(array) / sizeof(array);
bubble_sort(array, length);
printf("Sorted array: \n");
for (int i = 0; i < length; i++) {
printf("%d ", array[i]);
}
return 0;
}
```
归并排序
归并排序是一种分治算法,它将序列分成两个子序列,分别对子序列进行排序,然后将排序好的子序列合并起来。以下是归并排序的非递归实现:
```c
include include void merge(int arr[], int temp[], int left, int mid, int right) { int i = left, j = mid + 1, k = left; while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } for (i = left; i <= right; i++) { arr[i] = temp[i]; } } void merge_sort_non_recursive(int arr[], int temp[], int left, int right) { if (left < right) { int mid = left + (right - left) / 2; merge_sort_non_recursive(arr, temp, left, mid); merge_sort_non_recursive(arr, temp, mid + 1, right); merge(arr, temp, left, mid, right); } } int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(arr) / sizeof(arr); int temp[n]; merge_sort_non_recursive(arr, temp, 0, n - 1); printf("Sorted array: \n"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } ``` 这两种算法都遵循了分而治之的原则,通过递归的方式将问题分解为更小的子问题,然后合并子问题的解来得到最终结果。非递归实现通过使用栈来模拟递归过程,从而避免了递归调用的开销。