c语言常用的排序算法
时间: 2024-08-15 16:04:35 浏览: 37
C语言中常用的排序算法有多种,以下是其中几种常见的:
1. **冒泡排序(Bubble Sort)**:通过反复交换相邻元素使其逐渐有序的过程,时间复杂度一般为O(n^2)。
2. **选择排序(Selection Sort)**:每次从未排序部分找到最小值,放到已排序部分的末尾。时间复杂度始终为O(n^2)。
3. **插入排序(Insertion Sort)**:将待排序的元素逐个插入到已排序序列中的适当位置。对于接近有序的数组效率较高,时间复杂度平均为O(n^2),最好为O(n)。
4. **快速排序(Quick Sort)**:基于分治法,选取一个基准元素,将数组分为两部分,小于基准的放在左边,大于的放在右边,然后递归地对左右两部分进行排序。平均时间复杂度为O(n log n),最坏情况下为O(n^2)。
5. **归并排序(Merge Sort)**:也是分治策略,将数组分成两半,分别排序再合并。时间复杂度始终为O(n log n)。
6. **堆排序(Heap Sort)**:利用堆这种数据结构进行排序,构建最大堆或最小堆,然后将堆顶元素与最后一个元素交换,调整堆,重复此过程。时间复杂度为O(n log n)。
7. **计数排序(Counting Sort)**:适用于整数范围不大的情况,统计每个元素的频数,然后直接计算出每个元素在新数组中的位置。时间复杂度为O(n + k),k是数据范围。
8. **基数排序(Radix Sort)**:按照位数从低到高对数字进行排序,适用于非负整数。时间复杂度取决于数字的最大位数,可以达到线性时间。
相关问题
C语言快速排序算法的代码
### 回答1:
C语言快速排序算法的代码可以用如下代码实现:
void quicksort(int numbers[], int left, int right)
{
int pivot, l_hold, r_hold;
l_hold = left;
r_hold = right;
pivot = numbers[left];
while (left < right)
{
while ((numbers[right] >= pivot) && (left < right))
right--;
if (left != right)
{
numbers[left] = numbers[right];
left++;
}
while ((numbers[left] <= pivot) && (left < right))
left++;
if (left != right)
{
numbers[right] = numbers[left];
right--;
}
}
numbers[left] = pivot;
pivot = left;
left = l_hold;
right = r_hold;
if (left < pivot)
quicksort(numbers, left, pivot-1);
if (right > pivot)
quicksort(numbers, pivot+1, right);
}
### 回答2:
快速排序算法是一种常用的排序算法,其思想简单而高效。下面是C语言实现快速排序算法的代码:
```c
#include <stdio.h>
// 交换两个元素的值
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 将数组分为两部分,并返回分界点的索引
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]);
}
}
// 交换基准元素和大于基准的第一个元素
swap(&arr[i + 1], &arr[high]);
return (i + 1); // 返回分界点的索引
}
// 快速排序递归函数
void quickSort(int arr[], int low, int high) {
if (low < high) {
int partitionIndex = partition(arr, low, high); // 获取分界点的索引
// 对分界点的左边进行递归排序
quickSort(arr, low, partitionIndex - 1);
// 对分界点的右边进行递归排序
quickSort(arr, partitionIndex + 1, high);
}
}
int main() {
int arr[] = { 99, 1, 33, 55, 88, 77, 22, 11 };
int n = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, 0, n - 1); // 调用快速排序函数
printf("排序后的数组:\n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
```
以上的代码实现了快速排序算法。首先定义了一个swap()函数用于交换两个元素的值。然后定义了一个partition()函数,该函数通过选取最后一个元素作为基准,将数组分为两部分,并返回分界点的索引。最后定义了quickSort()函数,该函数使用递归的方式对分界点的左边和右边进行排序。在main()函数中,我们定义了一个待排序的数组,然后调用quickSort()函数进行排序,并输出排序后的结果。
快速排序算法的时间复杂度为O(nlogn),其中n为数组的大小。它是一种原地排序算法,不需要额外的空间复杂度。因此,快速排序是一种高效的排序算法。
### 回答3:
C语言快速排序算法的代码如下:
```c
#include <stdio.h>
void swap(int* a, int* b){
int temp = *a;
*a = *b;
*b = temp;
}
int partition(int array[], int low, int high){
int pivot = array[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++){
if (array[j] < pivot){
i++;
swap(&array[i], &array[j]);
}
}
swap(&array[i + 1], &array[high]);
return (i + 1);
}
void quickSort(int array[], int low, int high){
if (low < high){
int pi = partition(array, low, high);
quickSort(array, low, pi - 1);
quickSort(array, pi + 1, high);
}
}
void printArray(int array[], int size){
for (int i = 0; i < size; i++){
printf("%d ", array[i]);
}
printf("\n");
}
int main(){
int array[] = {64, 25, 12, 22, 11};
int size = sizeof(array) / sizeof(array[0]);
printf("原始数组:");
printArray(array, size);
quickSort(array, 0, size - 1);
printf("排序结果:");
printArray(array, size);
return 0;
}
```
这段代码实现了快速排序算法。快速排序是一种分而治之的排序算法,通过选择一个元素作为基准值,将数组分为小于基准值和大于基准值的两部分,再对两部分进行递归排序,最后将排好序的两部分合并起来。在代码中,我们使用了`partition`函数来确定每一次排序的基准值位置,然后使用递归调用`quickSort`函数进行分组排序,直到排序完成。最后,我们使用`printArray`函数打印排序结果。
写一份C语言快速排序算法
### 回答1:
以下是C语言实现的快速排序算法:
```c
#include <stdio.h>
// 交换函数
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 分割函数
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]);
}
}
swap(&arr[i + 1], &arr[high]);
return (i + 1);
}
// 快速排序函数
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
// 测试函数
int main() {
int arr[] = { 10, 7, 8, 9, 1, 5 };
int n = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, 0, n - 1);
printf("排序后的数组: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
```
快速排序算法的时间复杂度为 O(n log n),在大多数情况下比其他常见的排序算法更快。
### 回答2:
快速排序(Quick Sort)是一种高效的排序算法,采用“分治”的思想实现。下面是一个使用C语言实现的快速排序算法的示例:
```c
#include <stdio.h>
// 交换两个元素的值
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 划分子数组,返回划分位置的下标
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]);
}
}
// 将基准值交换到正确的位置
swap(&arr[i + 1], &arr[high]);
return i + 1;
}
// 快速排序递归函数
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high); // 划分位置的下标
// 递归地排序基准值左边的子数组和右边的子数组
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
// 测试示例
int main() {
int arr[] = {9, 5, 2, 7, 1, 8};
int n = sizeof(arr) / sizeof(arr[0]);
printf("原数组:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
quickSort(arr, 0, n - 1);
printf("\n排序后的数组:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
```
以上代码实现了快速排序算法。它首先选择数组中最后一个元素作为基准值,然后通过划分子数组的方式将小于等于基准值的元素移动到基准值的左边,将大于基准值的元素移动到其右边。然后递归地对基准值左边的子数组和右边的子数组执行同样的操作。最终,整个数组变为有序。以上代码在测试中使用了一个示例数组进行排序,并输出排序前和排序后的数组。
### 回答3:
快速排序是一种常用的排序算法,使用分而治之的策略。下面是使用C语言编写的快速排序算法示例:
```c
#include <stdio.h>
// 交换两个元素的函数
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 对数组进行划分,并返回划分后的中间位置索引
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]);
}
}
// 将基准点放入正确的位置
swap(&arr[i + 1], &arr[high]);
return (i + 1); // 返回基准点的位置
}
// 快速排序函数
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pivot = partition(arr, low, high); // 将数组划分为两部分
quickSort(arr, low, pivot - 1); // 对左侧子数组进行快速排序
quickSort(arr, pivot + 1, high); // 对右侧子数组进行快速排序
}
}
// 测试
int main() {
int arr[] = {10, 7, 8, 9, 1, 5};
int n = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, 0, n - 1);
printf("排序后的数组: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
```
以上代码中,快速排序函数`quickSort`调用了`partition`函数来划分数组,并递归地对左侧和右侧子数组进行排序。`swap`函数用于交换两个元素的值。
在`main`函数中,首先定义了一个整数数组`arr`,然后调用`quickSort`函数对该数组进行快速排序。最后,打印出排序后的数组。
运行结果:
```
排序后的数组: 1 5 7 8 9 10
```
这就是使用C语言编写的快速排序算法。快速排序是一种高效的排序算法,平均时间复杂度为O(nlogn)。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)