c编程怎么排序非递归

时间:2025-01-23 13:33:34 游戏攻略

在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;

}

```

这两种算法都遵循了分而治之的原则,通过递归的方式将问题分解为更小的子问题,然后合并子问题的解来得到最终结果。非递归实现通过使用栈来模拟递归过程,从而避免了递归调用的开销。