#if 0
### 快速排序原理
- 利用双指针将小数放在左边,大数放在右边
### 编程思路
- 选定左右指针(left、right)和基数(basic),基数随机设为left对应的值
- right探测小于basic,停下来准备和left交换(找大数)
- left探测大于basic,停下来和right交换(找小数)
- right继续探测直到小于basic,直到遇到left
- left继续探测直到大于basic,直到遇到right
- 若两则相遇,则将相遇的数(i或j)与基数(basic)交换,到此时完成一次循环。
> -将离散数列分成两部分左边小于基数,右边大于基数
> -递归左右两边继续快排
```c
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap(int* a, int* b);
int Partion(int arr[], int left_bound, int right_bound);
void QuickSort(int arr[], int left_bound, int right_bound);
void ra(void);
int arr[] = {4,6,9,6,0,3,11,90,-3,7,3,2,1,6,5};
int len = sizeof(arr) / sizeof(arr[0]);
int main() {
printf("before:"); for (int i = 0; i < len; i++) printf("%d ", arr[i]); printf("\n");
//Partion(arr, 0, len - 1);
QuickSort(arr, 0, len -1);
printf("after :"); for (int i = 0; i < len; i++) printf("%d ", arr[i]); printf("\n");
system("pause");
return 0;
}
#if 1
int Partion(int arr[], int left_bound, int right_bound) {//实现“治”
int left = left_bound;
int right = right_bound;
int pivot = arr[left_bound];
if (left_bound > right_bound)
return -1;
while (left < right)
{
while (arr[right] >= pivot && left < right) //找大数
right--;
while (arr[left] <= pivot && left < right) //找小数
left++;
if (left < right) //不能越界交换
swap(&arr[left], &arr[right]);
}
swap(&arr[left_bound], &arr[left]); //相遇换轴
return left;
}
/* 快排思想:设轴,左边小于轴的和右边大于轴的交换
* Time:O(NlogN)
* Space: O(logN)
* 递归的层数,每层存取的临时变量
*/
void QuickSort(int arr[], int left_bound, int right_bound)
{
if (left_bound > right_bound) return;
int pivot_ptr = Partion(arr, left_bound, right_bound);
QuickSort(arr, left_bound, pivot_ptr - 1);
QuickSort(arr, pivot_ptr + 1, right_bound);
}
#endif
void swap(int* a, int* b)
{
int tmp = 0;
tmp = *a;
*a = *b;
*b = tmp;
}
#if 0
int Partion(int arr[], int left_bound, int right_bound) {//实现“治”
printf("before_arr: "); for (int i = left_bound; i < right_bound + 1; i++) printf("%d ", arr[i]); printf("\n");
int left = left_bound;
int right = right_bound - 1;
int pivot = arr[right_bound];
printf("left_bound = %d\tright_bound = %d\tpivot = %d\n", left_bound, right_bound, pivot);
while (left <= right)
{
while (arr[right] >= pivot && left <= right) //找大数
right--;
while (arr[left] < pivot && left <= right) //找小于或等于的数
left++;
printf("in the while--"); printf("left = %d\tright = %d\n", left, right);
if (left < right) //不能越界交换
swap(&arr[left], &arr[right]);
printf("in the while--"); for (int i = left_bound; i < right_bound + 1; i++) printf("%d ", arr[i]); printf("\n");
}
swap(&arr[right_bound], &arr[left]); //相遇换轴
printf("aftre_arr: "); for (int i = left_bound; i < right_bound + 1; i++) printf("%d ", arr[i]); printf("\n");
return left;
}
/* 快排思想:设轴,左边小于轴的和右边大于轴的交换
* Time:O(NlogN)
* Space: O(logN)
* 递归的层数,每层存取的临时变量
*/
void QuickSort(int arr[], int left_bound, int right_bound)
{
if (left_bound > right_bound) return;
int pivot_ptr = Partion(arr, left_bound, right_bound);
QuickSort(arr, left_bound, pivot_ptr - 1);
QuickSort(arr, pivot_ptr + 1, right_bound);
}
#endif
快速排序
最新推荐文章于 2020-06-03 15:32:45 发布