C语言设计出(冒泡排序、快速排序和归并排序)的递归和非递归排序算法;对数组中的数据进行排序(按从小到大的顺序排序);
时间: 2024-09-29 13:05:40 浏览: 47
C语言中,我们可以分别用递归和非递归的方式实现三种常见的排序算法:冒泡排序、快速排序和归并排序。
1. **冒泡排序 (非递归)**:
```c
void bubble_sort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
```
2. **冒泡排序 (递归)**:
由于冒泡排序不适合直接递归实现,因为每轮循环都会缩小未排序区间的范围,所以这里不是典型的应用。但在某些特定场景下,可以编写类似于“选择排序”的递归版本,但这通常效率较低。
3. **快速排序 (非递归)**:
```c
void quick_sort(int arr[], int low, int high) {
if (low < high) {
int pivot_index = partition(arr, low, high);
quick_sort(arr, low, pivot_index - 1);
quick_sort(arr, pivot_index + 1, high);
}
}
int partition(int arr[], int low, int high) {
int pivot = arr[high], i = low - 1;
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
return i + 1;
}
```
4. **归并排序 (非递归):**
```c
void merge_sort(int arr[], int l, int r) {
if (l < r) {
int mid = l + (r - l) / 2;
merge_sort(arr, l, mid);
merge_sort(arr, mid + 1, r);
merge(arr, l, mid, r);
}
}
void merge(int arr[], int l, int m, int r) {
int i, j, k;
int n1 = m - l + 1;
int n2 = r - m;
int L[n1], R[n2];
for (i = 0; i < n1; i++)
L[i] = arr[l + i];
for (j = 0; j < n2; j++)
R[j] = arr[m + 1+ j];
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++];
}
```
阅读全文