快速排序是一种分治算法,其基本原理如下:
- 选择一个基准元素(pivot),通常选择序列中的第一个元素。
- 将序列分为两部分,使得左边部分的元素都小于等于基准元素,右边部分的元素都大于基准元素。这个过程称为分区(partition)操作。
- 对左右两部分分别递归地应用快速排序算法。
- 当左右两部分都排序完毕后,整个序列就变得有序。
具体实现时,快速排序的分区操作可以采用多种方法,常见的是使用双指针或者挖坑填数的方式进行分区。在实际应用中,为了提高排序的稳定性,通常会对小规模子序列采用其他排序算法,例如插入排序。快速排序的时间复杂度通常为O(nlogn),在最坏情况下为O(n^2)。快速排序是一种不稳定的排序算法,因为在分区操作中可能会改变相同元素的相对顺序。快速排序在实际应用中广泛使用,因为它在平均情况下具有较好的性能,并且可以采用原地排序的方式,节省了额外的空间开销。
递归结束的条件是I < J
快速排序代码截图
快速排序代码实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include <time.h>
#include <sys/timeb.h>
#define MAX 10
using namespace std;
// 打印函数
void PrintArray(int arr[], int length) {
for (int i = 0; i < length; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
// 快速排序的实现,从小到大
void QuickSort(int arr[],int start, int end) {
//
int i = start;
int j = end;
// 基准数所有的数都和他进行比较
int temp = arr[start];
if (i < j) {
while (i < j) {
while (i < j && arr[j] >= temp) {
//从右向左找符合条件的
j--;
}
// 填充数据
if (i < j) {
arr[i] = arr[j];
i++;
}
// 从左向右找比基准数更大的数
while (i < j && arr[i] < temp) {
i++;
}
// 填坑
if (i < j) {
arr[j] = arr[i];
j--;
}
}
// 把基准数放到i的位置或者是j的位置
arr[i] = temp;
// 对基准数的左半部分进行快速排序
QuickSort(arr, start, i - 1);
// 对基准数的右半部分进行快速排序
QuickSort(arr, i + 1, end);
}
}
int main(void)
{
int myArr[] = { 4,2,8,0,5,7,1,3,9 };
int len = sizeof(myArr) / sizeof(myArr[0]);
PrintArray(myArr, len);
QuickSort(myArr,0,len - 1);
PrintArray(myArr, len);
return 0;
}
快速排序运行结果展示