【排序】 快速排序代码-C语言版

排序代码

#include <stdio.h>
#include <stdlib.h>

// increase sort
int partition(int arr[], int low, int high)
{
	int pivot = (low+high)/2;
	int pivot_key = arr[(low+high)/2];
	arr[pivot] = arr[low];
	while (low < high) {
		while ( (arr[high] > pivot_key) && (low < high) ) {
			high--;
		}
		if ( low < high ) 
			arr[low++] = arr[high];
		while ( (arr[low] < pivot_key) && (low < high) ) {
			low++;
		}
		if ( low < high )
			arr[high--] = arr[low];
	}
	arr[low] = pivot_key;
	return low;
}

void qsort(int arr[], int low, int high)
{
	int pivot = partition(arr, low, high);
	if (pivot > low) 
		qsort(arr, low, pivot-1);
	if (high > pivot)
		qsort(arr, pivot+1, high);
}

void qsort(int arr[], int len)
{
	qsort(arr, 0, len-1);
}

测试代码

void print_arr(int arr[], int len)
{
	for (int i=0; i<len; ++i) {
		printf ("%3d ", arr[i]);
	}	
	printf("\n");
}

void qsort_test(int arr[], int len)
{
	printf("before sort :");
	print_arr(arr, len);
	printf("after sort  :");
	qsort(arr, len);
	print_arr(arr, len);
	printf("******************************************\n");
}

void test_qort_func()
{
	// 有点挫...简单测一下~~~ 有时间再改改  
	int arr1[] = {1};
	int arr2[] = {1,2,3};
	int arr3[] = {3,2,1};
	int arr4[] = {1,2,2,1,4,5};
	int arr5[] = {7,5,9,20,13,108,3,7,1,-4,28};
	qsort_test( arr1, sizeof(arr1)/sizeof(int));
	qsort_test( arr2, sizeof(arr2)/sizeof(int));
	qsort_test( arr3, sizeof(arr3)/sizeof(int));
	qsort_test( arr4, sizeof(arr4)/sizeof(int));
	qsort_test( arr5, sizeof(arr5)/sizeof(int));
}

int main(int argc, char* argv[])
{
	test_qort_func();
	return 0;
}

PS:

简单补充一下:
       大家都理解快排的思路就是选一个pivot,然后遍历,把小于pivot的放到前面,大于pivot的放到后面。但是这个思路转换成代码怎么实现?本文也是参照教科书,给出一个相对比较高效的实现方式。即(以升序为例):
1、左右交替检索,先从左边检索,如比pivot小则继续,否则跳到最右边继续反向检索;
2、从右边检索时,如果某个值大于pivot,则继续,否则说明这个需要被交换到左侧。则将它与左边检索停止处的值交换
3、检索时,把pivot的值保存到一个临时变量,这样数组中就空出来一个“坑”,当需要交换时,直接把值填到这个“坑”里。然后又空出来一个新的坑,供下次交换使用;
4、注意递归的实现方式。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值