给定一个数组和一个数num,把<=num的数放在数组左边,>num的数放在数组右边
- void calc(int *arr, int n, int num)
- {
- int l = -1;
- int temp;
- for(int i=0;i<n;i++)
- {
- if(arr[i] <= num)
- {
- temp = arr[l+1];
- arr[l+1] = arr[i];
- arr[i] = temp;
- l++;
- }
- }
- }
给定一个数组和一个数,
- void calc(int *arr, int n, int num)
- {
- int l = -1;
- int r = n + 1;
- int temp;
- int idx = 0;
- while(idx < r)
- {
- if(arr[idx] < num)
- {
- temp = arr[l+1];
- arr[l+1] = arr[idx];
- arr[idx] = temp;
- l++;
- idx++;
- }
- else if(arr[idx] > num)
- {
- temp = arr[r-1];
- arr[r-1] = arr[idx];
- arr[idx] = temp;
- r--;
- }
- else
- {
- idx++;
- }
- }
- }
时间复杂度:O(N*logN)
空间复杂度:O(logN)
稳定性:不稳定
方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
- void swap(int *arr, int x, int y)
- {
- int temp;
- temp = *(arr + x);
- *(arr + x) = *(arr + y);
- *(arr + y) = temp;
-
- }
- int* temp(int *arr, int l, int r)
- {
- int cmp = arr[r];
- int idx = l;
- int *result = (int *)malloc(sizeof(int)*2);
- memset(result, 0, sizeof(int)*2);
- while(idx <= r)
- {
- if(arr[idx] < cmp)
- {
- swap(arr, l++, idx++)
- }
- else if(arr[idx] > cmp)
- {
- swap(arr, r--, idx);
- }
- else
- {
- idx++;
- }
- }
- *(result + 1) = idx--;
- while(arr[idx] == cmp)
- {
- idx--;
- }
- *result = idx;
- return result;
- }
-
- void qsrot(int *arr, int l, int r)
- {
- int *res = NULL;
- if(l >= r)
- {
- return;
- }
-
- res = temp(arr, l, r);
- qsrot(arr, l, *res);
- qsrot(arr, *(res+1), r);
-
- free(res);
- }