正序
#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;
}