常见排序算法–快速排序
算法思想:以数组中第一个点为分界点,数组中比它小的所有结点就排在它的左边,比它大的所有结点排在它的右边;然后将左边数组,右边数组看成一个整体分别按照这种规则进行排序,直达所有结点排序完成。下面我结合实际例子进行解释
假设初始数组为{5,2,7,9,1},第一步取数组第一个点5与数组最右边的数比较,如果最右边的数字比5大,就依次遍历这个最右边数字左边的数,直到找到比这个数小的数,按照上面数组最右边数字1比5小,接下来把数字1复制到数字5的位子,(此时数字1的位置空了)接下来从左到右比较,直到找到一个数(数字7)比数字5大,把数字7复制到空了的位置,然后按照上述规则比较,直到两边比较的数字标号重合,完成一遍排序。
初始状态 | 5 | 2 | 7 | 9 | 1 | |
---|
第一步 | 1 | 2 | 7 | 9 | | |
第二步 | 1 | 2 | | 9 | 7 | |
第三步 | 1 | 2 | 5 | 9 | 7 | |
这样,小于数字5的全放在了左边,大于数字5的全放在了右边
接下来按照这种规则将数组{1,2,},{9,7}进行排序,
。。。。。。
最后得到排列1,2,5,7,9
左边数组 | 1 | 2 | 右边数组 | 9 | 7 |
---|
排序后 | 1 | 2 | | 7 | |
排序后 | 1 | 2 | | 7 | 9 |
代码如下
//首先以数组的第一个为基本比照点,先与最右边的比较,直到找到一个比它小的数位置j,然后这个小的数就跳到基本点的i位置,接下来以基本点以右进行比较,直到发现比这个基本点的数大的,将这个数跳到j的位置上,然后从j开始。。。直到j和i重合,停止跳动,一趟遍历就做好了
void pai(int a[],int low,int high)
{
int i=low,j=high,term=a[low]
if(i<j)
{
while(i!=j)
{
while(a[j]>term&&j!=i)
{
j--
}
if(j!=i)
a[i]=a[j]
while(a[i]<term&&i!=j)
{
i++
}
if(j!=i)
a[j]=a[i]
}
a[i]=term
//将一趟遍历做好。
//将剩下来的点按照这种规律进行定点,直到所有点遍历完成
pai(a,1ow,i-1)
pai(a,i+1,high)
}
}