您的位置:首页 > 编程语言 > C语言/C++

快速排序(正序+倒序)C语言版

2021-01-28 20:13 806 查看

正序

#include <stdio.h>

void sort(int *, int, int);
void sort(int arr[], int left, int right)
{
// 如果数组(子数组)只有1个元素时直接返回
if (left == right) {
return;
}

// i为左向右移动位置指针,j为右向左移动位置指针
int i, j, tmp;
// 第1个元素作为本轮排序的参考值
i = left + 1;
j = right;

while (i < j) {
// 必须j先查找,条件匹配即停止
// while (i < j && arr[j] > arr[left]) {
while (i < j && !(arr[j] <= arr[left])) {
j--;
}

// i开始查找,条件匹配即停止
// while (i < j && arr[i] <= arr[left]) {
while (i < j && !(arr[i] > arr[left])) {
i++;
}

// 交换i和j位置的数值,可能是两个位置,也可能是同位置(虽然多余,但不影响结果)
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}

// 执行到这里本轮的i,j查找已经结束,且两者位置重合,重合位置为拆分数组的分隔点
// 参考值>i位置交换(因本次为正序)
if (arr[left] > arr[i]) {
tmp = arr[left];
arr[left] = arr[i];
arr[i] = tmp;
}

// 拆分为2个数组递归,左子数组不包含拆分点,右数组在至少包含拆分点本身1个元素(在本轮子数组为2个元素时的情况)
sort(arr, left, i - 1);
sort(arr, i, right);
}

int main(void)
{
int arr[] = {12, 3, 7, 25, 11, 5, 23, 5, 0};
int length;
length = sizeof(arr) / sizeof(int);
sort(arr,  0, length - 1);
printf("-------------------\n");
for ( int i = 0; i < length; i++ ) {
printf("%d, ", arr[i]);
}
printf("\n");
return 0;
}

倒序

#include <stdio.h>

void sort(int *, int, int);
void sort(int arr[], int left, int right)
{
if (left == right) {
return;
}

int i, j, tmp;
i = left + 1;
j = right;

while (i < j) {
while (i < j && arr[j] < arr[left]) {
//while (i < j && !(arr[j] >= arr[left])) {
j--;
}

while (i < j && arr[i] >= arr[left]) {
//while (i < j && !(arr[i] < arr[left])) {
i++;
}

tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
if (arr[left] < arr[i]) {
tmp = arr[left];
arr[left] = arr[i];
arr[i] = tmp;
}

sort(arr, left, i - 1);
sort(arr, i, right);
}

int main(void)
{
int arr[] = {12, 3, 7, 25, 11, 5, 23, 5, 0};

int length;
length = sizeof(arr) / sizeof(int);
sort(arr,  0, length - 1);
printf("-------------------\n");
for ( int i = 0; i < length; i++ ) {
printf("%d, ", arr[i]);
}
printf("\n");

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: