目錄提供序列a[p...r],要求以a[r]為分界值,將原序列分兩部分;
其中a[p...q-1]中元素值小於分界值,a[q+1...r]中的元素值大於分界值;
返回新序列中的分界值下標q
說明:逐個比較序列值,若是其值大於分界值,則將其移到序列尾部,序列其他值前移;可能需要頻繁移動陣列,效率較低
int partitionv1(void *array, int size, int p, int r, int(*cmp)(void *, void *))
// 將當前遍歷移到序列末尾
memcpy(array + r * size, arraytemp, size);
// 分界值會同步向前移動一位,分界值同步前移一位
keypost--;
// 由於序列移動,當前i指向的值已經更新,所以需要將當下的i值再次進入for迴圈判斷,i--與for中i++抵消
i--;
}printflist("partation test: ", (int*)array, array_len);
}free(arraytemp);
free(key);
return keypost;
}
// 元素交換
void swap(void *x, void *y, int size)
/* * description: 將序列array按array[r -1]的值為分界點,分成兩部分,原地修改
* input: 序列指標array,元素大小size,p和r為序列下標,即array[p...r],比較函式cmp
* output: 分界點在重組序列後的下標
*/int partitionv2(void *array, int size, int p, int r, int(*cmp)(void *, void *))
printflist("partitionv2 test: ", (int*)array, array_len);
}free(key);
// 遍歷完成後,[p, lefttail]均為小於key的元素,則將lefttail+1與序列末尾的key交換即可
swap(array + (lefttail + 1) * size, array + r *size, size);
return lefttail + 1;
}
測試**:
#include #include #include #define array_len 10
static void printflist(char *info, int *array, int len)
printf("\n");
return;
}int intgreater(void *x, void *y)
int main(void)
; printflist("array before partation: ", array, array_len);
int pos = partitionv1(array, sizeof(int), 0, array_len - 1, intgreater);
// int pos = partitionv2(array, sizeof(int), 0, array_len - 1, intgreater);
printflist("array after partation: ", array, array_len);
printf("pos = %d\n", pos);
while (1);
return 0;
}
方法一測試結果:
方法二測試結果:
演算法筆記 B1046 划拳
1046 划拳 15 分 划拳是古老中國酒文化的乙個有趣的組成部分。酒桌上兩人划拳的方法為 每人口中喊出乙個數字,同時用手比劃出乙個數字。如果誰比劃出的數字正好等於兩人喊出的數字之和,誰就贏了,輸家罰一杯酒。兩人同贏或兩人同輸則繼續下一輪,直到唯一的贏家出現。下面給出甲 乙兩人的划拳記錄,請你統計他...
反射三(泛型)
泛型和反射 關鍵點是如何通過class的到t對應的clazz 1 新建帶泛型的父類例 dao 2 子類繼承父類,並指定泛型的型別 public class persondao extends dao 3 獲取父類泛型引數具體class 獲取子類class class clazz persondao....
C 泛型演算法
標準庫並未給每個容器都定義成員函式來實現這些操作,而是定義了一組泛型演算法,稱他們為演算法是因為他們實現了一些經典演算法的公共介面,如排序和搜尋 稱他們為排序的是因為它們可以用於不同型別的元素和多種容器型別。大多數演算法都定義在標頭檔案algorithm中。標準庫還在標頭檔案numeric中定義了一...