ESP-IDF:快速排序测试
/快速排序测试/
void printArray(int arr[], int len)
{
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
void QuickSort(int arr[], int start, int end)
{
int i = start;
int j = end;
// 找一个基准数
int temp = arr[i]; // temp保存了arr[i]的值,arr[i]目前就是坑了
if (i < j)
{ // 循环的条件是i小于j
while (i < j)
{
while (i < j && arr[j] >= temp)
{ // 从右往左找比temp小的数,找到了跳出这个循环
j–;
}
if (i < j)
{
arr[i] = arr[j]; // 把这个数放到arr[i]这个坑中,目前arr[j]就是坑了
i++; // 左边指针往右走
}
while (i < j && arr[i] < temp)
{ // 然后从左往右找比temp大的数,找打后跳出这个循环
i++;
}
if (i < j)
{
arr[j] = arr[i]; // 把这个数放到arr[j]这个坑中
j–; // 右边指针往左走
}
}
arr[i] = temp; // 当i=j的时候,arr[i]这个坑的左边都是比基准值temp小的数,右边都是比基准值大的数,把temp填进坑中
QuickSort(arr, start, i - 1); // 左边递归挖坑填坑
QuickSort(arr, i + 1, end); // 左边递归挖坑填坑
}
}
void QuickSort02(int arr[], int start, int end)
{
int R = start;
int L = end;
int temp = arr[R]; // 把第一个值作为基准数,arr[R]目前是坑i
// 开始递归,递归推出条件是左右指针相等
if (R < L)
{
while (R < L)
{ // 先从右往左找比基准值temp小的数
while (R < L && arr[L] >= temp)
{ // 没找到继续跑,找到了跳出这个小循环
L–;
}
if (R < L)
{
arr[R] = arr[L]; // 填坑arr[R],同时arr[L]变成了坑
R++;
}
while (R < L && arr[R] < temp)
{ // 然后从左往右找比基准值temp大的数//没找到继续跑,找到了跳出这个小循环
R++;
}
if (R < L)
{
arr[L] = arr[R]; // 填坑arr[L],同时arr[R]变成了坑
L–;
}
}
arr[R] = temp; // arr[R]左边都是比基准值小的数,右边都是比基准值大的数,用基准值把这个坑填上
QuickSort02(arr, start, R - 1);
QuickSort02(arr, R + 1, end);
}
}
void test13()
{
cout << “--------test 快速排序--------” << endl;
int arr[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
// int arr[] = {5, 7, 9, 21, 33, 3, 2, 5, 8, 0};
printArray(arr, sizeof(arr) / sizeof(int));
QuickSort(arr, 0, sizeof(arr) / sizeof(int) - 1); // 注意数组下标是从0开始的
printArray(arr, sizeof(arr) / sizeof(int));
int arr02[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
printArray(arr02, sizeof(arr02) / sizeof(int));
QuickSort02(arr02, 0, sizeof(arr02) / sizeof(int) - 1);
printArray(arr02, sizeof(arr02) / sizeof(int));
}
extern “C” void app_main(void)
{
test13();
}