快速排序 C语言
LeetCode题型:待补充
#include<stdio.h>
#include<stdlib.h>
void swap(int *nums, int i, int j)
{
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
int partition(int *nums, int low, int high)//分治
{
int pivotkey;
pivotkey = nums[low]; //用子表的第一个记录作枢轴记录
while (low < high) //从表的两端交替向中间扫描
{
while (low < high && nums[high] >= pivotkey)
high--;
swap(nums, low, high); //将枢轴记录小的记录交换到低端
while (low < high && nums[low] <= pivotkey)
low++;
swap(nums, low, high); //将比枢轴记录大的记录交换到高端
}
return low; //返回枢轴所在位置
}
int partition2(int *nums, int low, int high){
int key = nums[low];
while(low < high){
while(low < high && nums[high] >= key){
high--;
}
nums[low] = nums[high];
while(low < high && nums[low] < key){
low++;
}
nums[high] = nums[low];
}
nums[low] = key;
return low;
}
void QSort(int *nums, int low, int high)
{
int pivot;
if (low < high)
{
//pivot = partition(nums, low, high); //算出枢轴值pivot
pivot = partition2(nums, low, high); //两种都可以
QSort(nums, low, pivot-1); //对低子表递归排序
QSort(nums, pivot+1, high); //对高子表递归排序
}
}
void PrintNums(int * nums, int len){
for(int i = 0; i < len; i++){
printf("%d ", nums[i]);
}
printf("\n");
}
void main(){
int nums[] = { 1, 3, 1, 4, 5};
int len = sizeof(nums)/sizeof(int);
PrintNums(nums, len);
QSort(nums, 0, len-1);
PrintNums(nums, len);
}