站点图标

C 快速排序

2018-11-27折腾记录Develop / 算法 / C
本文最后更新于 607 天前,文中所描述的信息可能已发生改变

开头和介绍都是不存在的( ̄︶ ̄)↗

这次是真修复了,坑爹呀,LintCode 提交了好几次,终于 AC 了,应该是没问题了 ≧ ﹏ ≦,另外我这代码只能算还行只打败了 51%的提交 (捂脸


_66
#include <stdio.h>
_66
#define N 10 //定义要排序的数组个数
_66
_66
//快速排序控制Demo
_66
_66
//快速排序函数
_66
int* Quick_Sort(int left, int right, int nums[])
_66
{
_66
//定义标记,并设置标记为排序数组最末端,即right的后一个数
_66
int pivot = right + 1;
_66
//存储最左端,为下一轮存储left标记
_66
int left_temp = left;
_66
//临时交换数
_66
int temp;
_66
//判断left标记是否已经到达right或right之后,若是则代表此轮排序的判断部分已经完成
_66
while(left < right)
_66
{
_66
//判断left标记的数是否小于标记的数,若是则向右移动left标记
_66
while(nums[left] < nums[pivot])
_66
{
_66
left++;
_66
if(left > right) break;
_66
}
_66
//判断right标记是否大于标记的数,若是则向左移动right标记
_66
while(nums[right] > nums[pivot])
_66
{
_66
right--;
_66
if(left > right) break;
_66
}
_66
//若left标记不小于right则代表此轮已经完成
_66
if(left >= right) break;
_66
//若不是,则将left和right标记数交换
_66
temp = nums[left];
_66
nums[left] = nums[right];
_66
nums[right] = temp;
_66
}
_66
//判断标记数是否是最大的,即left标记是否已经到达标记数,若不是则交换left标记数与标记数
_66
if(nums[left] >= nums[pivot])
_66
{
_66
temp = nums[left];
_66
nums[left] = nums[pivot];
_66
nums[pivot] = temp;
_66
}
_66
//判断是否要进行下一轮,若是则进行下一轮
_66
if(left_temp < left - 1) Quick_Sort(left_temp, left - 2, nums);
_66
if(left + 1 < pivot) Quick_Sort(left + 1, pivot - 1, nums);
_66
//返回排序好的数组
_66
return nums;
_66
}
_66
_66
int main(int argc, char const *argv[])
_66
{
_66
//定义要进行排序的数组
_66
int nums[N] = {5, 4, 7, 12, 4, 9, 2, 1, 13, 2};
_66
//设置数组长度
_66
int n = 10;
_66
//调用排序函数并将排序好的头指针传给p
_66
int *p = Quick_Sort(0, n - 2, nums);
_66
int i;
_66
//循环输出排序好的数组
_66
for(i = 0; i < n; i++)
_66
{
_66
printf("%d ",p[i]);
_66
}
_66
return 0;
_66
}

C 快速排序

https://blog.ixk.me/post/c-quick-sort
  • 许可协议

    BY-NC-SA

  • 发布于

    2018-11-27

  • 本文作者

    Otstar Lin

转载或引用本文时请遵守许可协议,注明出处、不得用于商业用途!

Java链表实现C 插入排序