排序算法之快速排序
直接上代码:
void swap(int a[],int m,int n) { int temp = a[m]; a[m] = a[n]; a[n] = 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}这样左边就有序了;
然后对于另一个数组进行同样的操作。直至所有有序。
现在再看一下上边的代码吧,应该有点好理解了吧。
----------------------------------------教你一招----------------------------------------
理解了上面所说的原理之后,然后自己编写代码。或者就直接把我上边的代码拷贝一下进行断点分析,这样就能够更深刻的理解然后自己写出来。
----------------------------------------结束了----------------------------------------
如果有啥疑问的尽管开口,知无不言。
如果有什么意见或建议,尽管提出。
谢谢。