您的位置:首页 > 其它

排序算法之快速排序

2015-08-18 23:45 323 查看
直接上代码:

void swap(int a[],int m,int n) {
int temp = a[m];
a[m] = a
;
a
= temp;
}
//开始的时候left是数组的起始位置0,right是数组最后一个元素的下标(这里是8)
void quickSort(int a[],int left ,int right) {
//从小到大排序{50,10,90,30,70,40,80,60,20}
int low = left;
int high = right;
int partition = a[low];
if (left>=right) {
return;
}

while (low!=high) {
while (low<high &&a[high]>=partition) {   //如果右边值大于partition
high--;
}
if (low<high) {
swap(a, low, high);
}

while (low<high && a[low]<=partition) {
low++;
}
if (low<high) {
swap(a, low, high);
}

}
//    printArr(a,9);
quickSort(a, left, low-1);
quickSort(a, low+1, right);
}


这里我定义了一个排序算法,一个交换算法。

不太理解?看着太复杂?那就往下看吧。

先介绍一下其原理:(这里我们按照从小到大排序)

首先,需要找第一个或者最后一个元素作为枢纽,然后用枢纽将数组分成两部分,大于枢纽的放在枢纽右边,小于枢纽的放在枢纽左边。举个栗子:

{50,30,40,74,23,67,56,68};

这个数组中我们选择第一个元素作为枢纽50,那么我们要做的就是把数组中小于50的数都放到50左边,大于50的数放在50右边。但是左边(或右边)的数不一定有序。例如

{30,40,23,50,74,56,67,68}

这样只是大致有序。

然后我们将枢纽50左边和右边分开,即成为两个数组

{30,40,23}和{74,56,67,68}

然后在按照上边的方法找一个枢纽再次进行排序:

将30作为枢纽,得到结果:{23,30,40}这样左边就有序了;

然后对于另一个数组进行同样的操作。直至所有有序。

现在再看一下上边的代码吧,应该有点好理解了吧。

----------------------------------------教你一招----------------------------------------

理解了上面所说的原理之后,然后自己编写代码。或者就直接把我上边的代码拷贝一下进行断点分析,这样就能够更深刻的理解然后自己写出来。

----------------------------------------结束了----------------------------------------

如果有啥疑问的尽管开口,知无不言。

如果有什么意见或建议,尽管提出。

谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: