赞
踩
网上也有很多类似的代码.在这里写一下自己对快速排序的理解.
快速排序()
{
{
将a[n]分为三个部分
第一个部分 小于或等于A的,a[m]到a[i]
第二个部分a[i] =a
第三个部分 大于后等于A的a[i+1]a[n]
}
将数组a 从a[m]到a[i-1]进行快速排序
将数组a 从a[i+1]到a[n]进行快速排序
}
对于链表也大概是这个思路.
/数组
对于数组a[n],实现a[m]到a[n]的排序,首先定义一个快速排序函数QuickSort函数,参数为数组首地址(a),和需要排序的起止坐标(m,n).
QuickSort函数的任务是将数组a[]中分为两部分,一部分大于A,一部分小于A.通常A为所需排序数组的第一个元素a[m].
这样第一次排序结束数组a,会是下面的情况
{ 小于A的元素 }{A}{大于A的元素}
这时候只需要在QuickSort函数内递归调用既可以实现快速排序
void QuickSort(int a[], int left, int right){
if (left < right)
{
int i = left, j = right, A;
A = a[left];
while (i < j) //将数组分为三个部分
{
while (i < j) //从右往左找,找到第一个比A小的数;
if (a[j] < A)
{
a[i++] = a[j];
break;
}
else j--;
while (i < j){//从右往左找,找到第一个比A大的数;
if (a[i]>A)
{
a[j--] = a[i];
break;
}
else i++;
}
}
a[i] = A; //将A赋给a[i]
QuickSort(a, left, i - 1);
QuickSort(a, i + 1, right);//递归
}
}

/单链表//
对于单链表的快速排序,设从链表头head到tail的快速排序
对于链表head-> -> ->——-> tail的排序
先设指针 p指向head,mid指向head->next,t指向mid->next ,q指向mid
因为我自己定义的head头结点有值,因此会多一个步骤.若第一个元素值大于第二个元素的值则交换他们,把较小的值存入mid->data
这样从指针while(t++!=NULL)判断t->data的值与mid->data的关系,分别将t放在放在p或者q后.最后另p->next=mid,q->next=tail;
再递归完成的快速排序.
void QuickSort(node *head, node *tail)
{
if (head == tail || head->next == tail)
return;
node *mid,*p,*q,*t;
mid = head->next;
p = head;
q = mid;
t = mid->next;
if (head->data > head->next->data)
SWAP(head->data,head->next->data);
while (t != tail)
{
if (t->data <= mid->data)
{
p->next = t;
p = p->next;
}
else{
q->next=t;
q = q->next;
}
t = t->next;
}
p->next= mid;
q->next = tail;
QuickSort(head, mid);
QuickSort(mid, tail);
}

用vs2015写的
http://pan.baidu.com/s/1gfayh4v
若有错误或更好的代码,希望能交流。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。