三向字符串快速排序
在将字符串数组排序时,根据首字母进行三向切分,然后(递归地)将得到的三个子数组排序:一个含有所有首字母小于切分字符的字符串子数组,一个含有所有首字母等于切分字符的字符串的子数组(排序时忽略它们的首字母),一个含有所有首字母大于切分字符的字符串的子数组。
代码实现
#include <stdio.h>
#include <malloc.h>
#include <memory.h>
#include <assert.h>
#define LENGTH 4
#define WORDLENGTH 3
#define CHARLENGTH 256
void exchange(int *a, const int i, const int j) {
int tmp = *(a + i);
*(a + i) = *(a + j);
*(a + j) = tmp;
}
void print(char *name[LENGTH]) {
for (int i = 0; i < LENGTH; i++) {
puts(name[i]);
}
}
void _sort(char *name[LENGTH], int low, int high, int dk) {
//dk name[n][dk]
if (high <= low)
return;
int lt = low, gt = high;
char tmp = name[low][dk];
for (int i = low+1; i <= gt; i++) { //notice
if (name[i][dk] < tmp) {
exchange(name, i, lt);
lt++;
}
else if (name[i][dk] > tmp) {
exchange(name, i, gt);
gt--;
i--; //notice
}
}
print(name);
_sort(name, low, lt - 1, dk);
if(tmp>0)
_sort(name, lt, gt, dk + 1);
_sort(name, gt + 1, high, dk);
}
void Quick3String(char *name[LENGTH]) {
_sort(name, 0, LENGTH - 1, 0);
}
void main() {
char *name[LENGTH] = {
"abc",
"def",
"ape",
"ap",
};
Quick3String(name);
}