1、快速排序:
/*
快速排序语言描述:
1、如无序数组[3 2 4 1 5 9]
a),先把第一项[3]取出来,
用[3]依次与其余项进行比较,
如果比[3]小就放[3]前边,2 1 都比[3]小,所以全部放到[3]前边
如果比[3]大就放[3]后边,4 5 9比[3]大,放到[3]后边
一趟排完后变成下边这样:
排序前 3 2 4 1 5 9
排序后 2 1 3 4 5 9
b),对前半拉[2 1]继续进行快速排序
重复步骤a)【取第一项 2与其余项比较】后变成下边这样:
排序前 2 1
排序后 1 2
前半拉排序完成。
c),对后半拉[4 5 9]继续进行快速排序
重复步骤a)【取第一项 4与其余项比较】后变成下边这样:
排序前 4 5 9
排序后 4 5 9
d),对后半拉[5 9]继续进行快速排序
重复步骤a)【取第一项 5与其余项比较】后变成下边这样:
排序前 5 9
排序后 5 9
d在这个例子中可以忽略,但是当后面的数字较小时就得必不可少的循环继续下去。
前半拉排序完成。
总的排序也完成:
排序前:[3 2 4 1 5 9]
排序后:[1 2 3 4 5 9]
*/
#include <stdio.h>
#include <stdlib.h>
//交换数
void swap(int *x,int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
//算数组折半的个数
int choose_pivot(int i,int j )
{
return((i+j) /2);
}
void quicksort(int list[],int m,int n)
{
int key,i,j,k;
if( m < n)
{
k = choose_pivot(m,n);
swap(&list[m],&list[k]);
key = list[m];
i = m+1;
j = n;
while(i <= j)
{
while((i <= n) && (list[i] <= key))
i++;
while((j >= m) && (list[j] > key))
j--;
if( i < j)
swap(&list[i],&list[j]);
}
// 交换两个元素的位置
swap(&list[m],&list[j]);
// 递归地对较小的数据序列进行排序
quicksort(list,m,j-1);
quicksort(list,j+1,n);
}
}
void printlist(int list[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%d\t",list[i]);
}
void main()
{
int list[6]={3, 2, 4, 1, 5, 9};
printf("进行排序之前的序列:\n");
printlist(list,6);
printf("\n");
quicksort(list,0,6);
printf("使用快速排序算法进行排序之后的序列:\n");
printlist(list,6);
}