常见的排序算法:
# 1.算法思想 快速排序之所以比较快,是因为与冒泡排序相比,每次的交换时跳跃式的,每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的都是$O(n^2)$,它的平均时间复杂度为$O(nlog_2n )$。
2.测试结果
3.完整代码
#include <malloc.h>
#include <stdio.h>
#define MAXSIZE 20
//一次划分
int partition(int a[], int low, int high) {
//设置枢轴为low所指的值
int pivot = a[low];
//开始划分
while (low < high) {
//当high所指值大于当前枢轴值时,high--
while (low < high && a[high] >= pivot)
high--;
a[low] = a[high];
//当low所指值小于当前枢轴值时,low++
while (low < high && a[low] <= pivot)
low++;
a[high] = a[low];
}
//此时low==high,将枢轴值赋值给a[low]
a[low] = pivot;
//返回当前low的值,即枢轴所在位置。
//此时low左边的值均小于枢轴值,右边均大于枢轴值
return low;
}
//快速排序
void quickSort(int a[], int low, int high) {
//设置枢轴位置初始为low
int pivot = low;
//开始划分
if (low < high) {
pivot = partition(a, low, high);
//递归调用,对两侧的数据进行划分
quickSort(a, low, pivot - 1);
quickSort(a, pivot + 1, high);
}
}
int main() {
int a[] = {49, 38, 65, 97, 76, 13, 27, 49};
int len = sizeof(a) / sizeof(a[0]);
int i;
int low = 0, high = len - 1;
printf("排序前为:\n");
for (i = 0; i < len; i++) {
printf("%d\t", a[i]);
}
quickSort(a, low, high);
printf("\n排序后为:\n");
for (i = 0; i < len; i++) {
printf("%d\t", a[i]);
}
return 0;
}