快速排序算法
快速排序算法(用递归和非递归的方式实现)
/*
假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,
然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。
一趟快速排序的算法是:
1)设置两个变量I、J,排序开始的时候 I=0,J=N-1;
2)以第一个数组元素作为关键数据,赋值给X,即X=A[0];
3)从J开始向前搜索,即由后开始向前搜索,找到第一个小于X的值,两者交换;
4)从I开始向后搜索,即由前开始向后搜索,找到第一个大于X的值,两者交换;
5)重复第3、4步,直到I=J;
*/
#include <stdio.h>
/****** 将快速排序的一趟放在内部(递归方式)*********/
void quicksort(int *a, int low, int high)
{
int i=low;
int j=high;
int key=a[i];
if(low<high)
{
while(i<j)
{
while((i<j) && (a[j]>=key))
{
j--;
}
a[i]=a[j];
while((i<j) && (a[i]<=key))
{
i++;
}
a[j]=a[i];
}
a[i]=key;
quicksort(a, low, i-1);
quicksort(a, j+1, high);
}
}
/**快速排序的一趟排序**/
int quick_once(int *a, int low, int high)
{
int key=a[low];
while(low < high)
{
while((low<high) && (a[high]>=key))
high--;
a[low] = a[high];
while((low<high) && (a[low]<=key))
low++;
a[high] = a[low];
}
a[low]=key;
return low;
}
/****递归方式***/
void quick_sort(int *a, int low, int high)
{
int k;
if(low < high)
{
k=quick_once(a, low, high);
quick_sort(a, low, k-1);
quick_sort(a, k+1, high);
}
}
/*****非递归方式******/
void quicksort_not(int *a, int low, int high)
{
int stack[20];
int top=0;
int k;
stack[++top]=low;
stack[++top]=high;
while(top>0)
{
high=stack[top--];
low=stack[top--];
k=quick_once(a, low, high);
if(low<k-1)
{
stack[++top]=low;
stack[++top]=k-1;
}
if(high>k+1)
{
stack[++top]=k+1;
stack[++top]=high;
}
}
}
void main()
{
int i=0;
int a[6] = {23,1,21,4,19, 3};
quicksort_not(a, 0, 5);
//quick_sort(a, 0, 5);
for(i=0;i<6;i++)
printf("%d ",a[i]);
printf("\n");
}