赞
踩
目录
quickSort函数是快速排序算法的核心函数,用于对传入的整型数组arr进行排序。该函数使用递归的方式实现快速排序。
其中,strat和end参数表示当前需要排序的数组部分的起始和终止下标,而mid则表示当前数组的中间下标,即分区中心下标,由partition函数返回。在排序的过程中,如果当前子数组只有一个或没有元素,则不进行划分,排序直接结束。
如果需要划分数组,则调用partition函数进行分区,将数组分为左右两部分,将各自递归进行排序,直到排序完整个数组。具体实现中,先取数组第一个元素作为分区元素,然后使用while循环,寻找需要交换的元素,将其移动到正确位置,直到左右指针相遇,并将分区元素与左指针交换后返回中心点的位置。
整个排序过程中,每次递归调用快速排序函数时,都传入需要排序的子数组部分,并一次次划分成更小的子数组,最终得到排序好的有序数组。
- // 定义快速排序函数,递归实现
- void quickSort(int(&arr)[10], int strat, int end) {
- // 前提条件
- if (strat >= end)
- return;
-
- // 分区,返回分区下标
- int mid = partition(arr, strat, end);
-
- // 递归调用
- quickSort(arr, strat, mid - 1);
- quickSort(arr, mid + 1, end);
-
- }
函数中的第一步是将数组第一个元素作为支点(pivot)。
int pivot = arr[strat];
函数定义了两个指针 left 和 right,分别初始化为 strat 和 end。接下来,左右指针开始分别从左侧和右侧遍历数组arr,找到需要交换的元素并将其交换位置。
- while (left < right) {
- while (arr[left] <= pivot && left < right)
- left++;
- while (arr[right] >= pivot && left < right)
- right--;
- swap(arr, left, right);
- }
通过left指针的位置来判断分割点的位置,left指针左侧的元素都小于pivot,右侧的元素都大于pivot。因此,判断left所指元素与pivot的大小关系,交换分割元素和left位置上的元素,更新分割点位置并返回。
- if (arr[left] < pivot) {
- // 将分割元素放到left指针指向的元素左边
- swap(arr, strat, left);
- return left;
- } else if (arr[left] > pivot) {
- // 将分割元素放到left指针指向的元素左边的前一个位置
- swap(arr, strat, left - 1);
- return left - 1;
- }
- // 数组分区
- int partition(int(&arr)[10], int strat, int end) {
- // 选取一个分区的-支点
- int pivot = arr[strat];
-
- // 左右指针指向
- int left = strat, right = end;
-
- while (left < right)
- {
- // 分别从左右两边遍历数组
- while (arr[left] <= pivot && left < right)
- left++;
- while (arr[right] >= pivot && left < right)
- right--;
-
- // 交换左右指针的值
- swap(arr, left, right);
- }
-
- if (arr[left] < pivot)
- {
- swap(arr, strat, left);
- return left;
- }
- else if (arr[left] > pivot)
- {
- swap(arr, strat, left - 1);
- return left - 1;
- }
- }
函数是对一个整型数组中的两个元素进行交换的函数,作用是将输入的整型数组arr中下标为i和j的元素交换位置。函数接收一个整型数组arr,和两个整型参数i和j,表示需要交换的元素在数组中的下标。函数先用一个中间变量temp记录第i个元素的值,然后将第i和j个元素的值进行交换。
- // 元素互换
- void swap(int(&arr)[10],int i,int j) {
- int temp = arr[i];
- arr[i] = arr[j];
- arr[j] = temp;
- }
函数使用了 范围for 循环来遍历整型数组 arr,输出数组中每个元素的值。语句cout << num << '\t';
会输出该元素后面跟着一个水平制表符\t
,使得数组中每个元素的输出结果之间都会隔开一段距离,便于观察。函数输出一个换行符 cout << endl;
,使得下一次调用该函数输出内容不会和上一次输出结果粘在一起,以便输出更加整洁。
- // 打印数组
- void printArr(int(&arr)[10]) {
- for (int num : arr)
- cout << num << '\t';
- cout << endl;
- }
- /*
- * 快速排序
- * @QuickSort()
- */
-
- // 定义快速排序函数,递归实现
- void quickSort(int(&arr)[10], int strat, int end) {
- // 前提条件
- if (strat >= end)
- return;
-
- // 分区,返回分区下标
- int mid = partition(arr, strat, end);
-
- // 递归调用
- quickSort(arr, strat, mid - 1);
- quickSort(arr, mid + 1, end);
-
- }
-
- // 数组分区
- int partition(int(&arr)[10], int strat, int end) {
- // 选取一个分区的-支点
- int pivot = arr[strat];
-
- // 左右指针指向
- int left = strat, right = end;
-
- while (left < right)
- {
- // 分别从左右两边遍历数组
- while (arr[left] <= pivot && left < right)
- left++;
- while (arr[right] >= pivot && left < right)
- right--;
-
- // 交换左右指针的值
- swap(arr, left, right);
- }
-
- if (arr[left] < pivot)
- {
- swap(arr, strat, left);
- return left;
- }
- else if (arr[left] > pivot)
- {
- swap(arr, strat, left - 1);
- return left - 1;
- }
- }
-
- // 元素互换
- void swap(int(&arr)[10],int i,int j) {
- int temp = arr[i];
- arr[i] = arr[j];
- arr[j] = temp;
- }
-
- // 打印数组
- void printArr(int(&arr)[10]) {
- for (int num : arr)
- cout << num << '\t';
- cout << endl;
- }
- #include<iostream>
- using namespace std;
-
- void quickSort(int(&arr)[10], int strat, int end);
- int partition(int(&arr)[10], int strat, int end);
- void swap(int(&arr)[10], int i, int j);
- void printArr(int(&arr)[10]);
-
- // 快速排序测试方法
- void Test() {
- int arr[10] = { 23, 45, 18, 6, 11, 19, 22, 18, 12, 9 };
- printArr(arr);
- int size = sizeof(arr) / sizeof(arr[0]);
- quickSort(arr, 0, size - 1);
- printArr(arr);
- }
萌新菜鸟上路,若有错误请指教
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。