快速排序:从一组数中找一个基准(一般选第一个值),先从后往前找,如果小于这个基准,把这个值放到基准的位置,接着从前往后找,如果大于这个基准,那就把这个位置的值放在空着的那个位置。如此循环就可以实现一组数的有序排列。
递归处理:
static int onequick(int *arr, int i, int j)
{
int tmp = arr[i];//以arr[i]为基准
while(i < j)
{
while(i < j) //从后往前找
{
if(arr[j] < tmp)
{
break;
}
else
{
j--;
}
}
arr[i] = arr[j];
while(*i<j) //从前往后找
{
if(arr[i] > tmp)
{
break;
}
else
{
i++;
}
}
arr[j] = arr[i];
}
arr[j] = tmp;
return i;
}
void MoreQuick(int *arr,int left,int right)
{
int mod = onequick(arr,left,right);
if(mod -left > 1) //递归处理左边的数字
{
MoreQuick(arr,left,mod-1);
}
if(right - mod > 1) //递归处理右边的数字
{
MoreQuick(arr,mod + 1,right);
}
}
void Quicksort(int *arr,int len)
{
MoreQuick(arr,0,len - 1);
}
非递归形式:
typedef struct stack//定义栈
{
int *data;
int top;
}stack;
void Quicksort_for(int *arr, int len,int left, int right)
{
stack st;
int size = (int)(log10((double)len)/log10((double)2)) + 1; // 表示以2为底对len取对数,次数
st.data = (int *)malloc(size*2*sizeof(int)); // 使用栈的次数*每次存2个*int的大小
assert(st.data == NULL);
if(st.data == NULL)
{
return ;
}
st.top = 0;
st.data[st.top++] = left; //入栈 ,先入左再入右,出栈则先出右再出左
st.data[st.top++] = right;
while(st.top != NULL)
{
left = st.data[st.top--]; //出栈 先出右再出左
right = st.data[st.top--];
int mod = onequick(arr,left,right);
if(mod - left > 1) //当左边的数字个数大于1时,入栈
{
st.data[st.top++] = left;
st.data[st.top++] = mod - 1;
}
if(right - mod > 1) //当右边的数字个数大于1时,入栈
{
st.data[st.top++] = mod+1;
st.data[st.top++] = right;
}
}
free(st.data);
}