/*
Name:QucikSort
Actor:HT
Time:2015年10月8日
Error Reporte: 1.注意处理相等的情况,小心下标越界
*/
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#define N 10010
//最优 O(nlogn)
//最差 O(n^2)
int a[N];
void qs(int *arr, int f, int rear) //分治求解函数
{
if (f >= rear) return;
int i, j, t;
int r = rear; //r是用来分割的首元,小的在i前,大的在i后
for (i = f - 1, j = f; j != r; j++) //i初始化,看起来有些危险,小心不要动
{
if (arr[j] <= arr[r]) //小了就往前放,i扩增;否则不变 debug出现了下标越界问题
{
t = arr[j];
arr[j] = arr[i + 1];
arr[i + 1] = t;
i++;
}
}
t = arr[r]; //把首元放到该放的位置上
arr[r] = arr[i + 1];
arr[i + 1] = t;
qs(arr, 0, i - 1);
qs(arr, i + 1, r);
}
void quciksort(int *arr, int n)
{
qs(arr, 0, n-1);
}
int main()
{
int i, j;
int n;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
quciksort(a, n);
for (i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
system("pause");
return 0;
}
Python:
def sort_kernel(s, begin, end):
if begin >= end:
return
rear = end - 1
head = begin
flag = s[rear]
while rear != head:
while s[head] <= flag and rear > head:
head += 1
s[rear] = s[head]
while s[rear] > flag and rear > head:
rear -= 1
s[head] = s[rear]
s[head] = flag
sort_kernel(s, begin, head)
sort_kernel(s, head + 1, end)
def qsort(s):
return sort_kernel(s, 0, len(s))
if __name__ == '__main__':
s = [2,4,2,6,8,3]
qsort(s)
print(s)