summaryrefslogtreecommitdiff
path: root/sort.c
diff options
context:
space:
mode:
Diffstat (limited to 'sort.c')
-rw-r--r--sort.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/sort.c b/sort.c
new file mode 100644
index 0000000..2044d57
--- /dev/null
+++ b/sort.c
@@ -0,0 +1,60 @@
+#include <stdio.h>
+
+int
+partition(int *nums, int low, int high)
+{
+ int pivot = nums[high];
+ int i = low - 1;
+ for (int j = low; j < high; ++j) {
+ if (nums[j] <= pivot) {
+ int tmp = nums[j];
+ nums[j] = nums[++i];
+ nums[i] = tmp;
+ }
+ }
+
+ nums[high] = nums[++i];
+ nums[i] = pivot;
+ return i;
+}
+
+int
+*quick(int *nums, int low, int high)
+{
+ if (low >= high) {
+ return nums;
+ }
+
+ int i = partition(nums, low, high);
+ nums = quick(nums, low, i - 1);
+ nums = quick(nums, i + 1, high);
+ return nums;
+}
+
+int
+*bubble(int *nums, int len)
+{
+ for (int i = 0; i < len; ++i) {
+ for (int j = i; j < len - 1 - i; ++j) {
+ if (nums[j] > nums[j + 1]) {
+ int tmp = nums[j];
+ nums[j] = nums[j + 1];
+ nums[j + 1] = tmp;
+ }
+ }
+ }
+ return nums;
+}
+
+int
+main()
+{
+ int nums[5] = {0, 4, 2, 1, 3};
+ int len = sizeof(nums) / sizeof(int);
+ /* int *res = bubble(nums, len); */
+ int *res = quick(nums, 0, 4);
+ for (int i = 0; i < len; ++i) {
+ printf("%d\n", res[i]);
+ }
+ return 0;
+}