排序算法之快速排序

直接上代码:

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}这样左边就有序了;

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

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

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

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

 

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

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

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

谢谢。

posted @ 2015-08-18 23:45  zhanggui  阅读(304)  评论(0编辑  收藏  举报