快速排序

来源:互联网 发布:橡胶木 知乎 编辑:程序博客网 时间:2024/05/21 09:25

快速排序(QUICK SORT)是由C.A.R Hoarse提出的一种排序算法。它是冒泡排序的改进算法。由于快速排序算法元素之间的比较次数较少,速度较快,因而得名快速排序。在各种内部排序算法中,快速排序被认为是目前最好的一种排序算法。

快速排序的基本思想是:在当前的排序序列(K1,K2,...KN)中任意选取一个元素,把该元素称为基准元素或支点,把小于等于基准元素的所有元素都移动到基准元素的后面,把大于基准元素的所有元素都移动到基准元素的后面,这样使得基准元素所处的位置恰好就是排序的最终位置,并把当前参加排序的序列划分为前后两个子序列。其中,前面的子序列中的元素都小于等于基准元素,后面的子序列的元素都大于基准元素。接下来分别对这两个子序列重复执行上述的排序操作(如果子序列的长度大于1),直到使得所有元素都被移动到排序后它们应处的最终位置上

假设有一个序列为:{5,7,4,2,11,10,6}

首先设置两个变量 i 和 j。i=1,指向元素5;j=7,指向元素6.设定基准元素为i指向的元素5,如下所示:

 {5,7,4,2,11,10, 6}

    i                                                                   j

下面就开始查找比基准5大元素,i++从左向右查找第一个大于基准元素5的数,就是7,这时i指向7,;

接着j从右向左查找第一个小于基准元素5的数,如果j>i,并且元素大于基准元素5,j继续减一(j--)直到找到为止;如下所示:

 {5, 7, 4, 2, 11, 10, 6 }

      i       j

此时交换7 和2 位置,如下所示:

{5,2,4,7,11,10,6}

然后i继续向右查找大于基准元素5的数,i指向了4;

j继续向左查找小于基准元素5的数,j也指向了4;i和j相遇,此时第一次的查找就结束了;如下所示:

{5,2,  4,  7,11,10,6}

         i j

最后交换i和j共同指向的元素(4)与基准元素的位置

{4,2,5,7,11,10,6}

此时基准元素就在排好序的正确位置上,到此,一趟快速排序结束。

然后就递归的调用快速排序分别排序小于5的左半部分和大于5的右半部分。

这是自己写的一段测试代码(c):

quicksort.c:

#include<stdio.h>


void swap(int *a,int *b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}//交换函数



//快速排序,整型数组A[L...R]
void quicksort(int A[],int L,int R){
int i,j,key;
i = L;
j=R;
key = A[L];//基准元素为A的第一个元素
if((R-L)<= 1)//如果数组元素少于或者等于一个,程序返回
        return;
while(i<j){//只要i<j或者说i,j不相遇就一直循环


while((i<j) && (A[i]<key))//从左向右查找大于基准元素的数
 i++;
while((i<j)&&(A[j]>key))//从右向左查找小于基准元素的数
j--;


swap(&A[i],&A[j]);//交换A[i] 和A[j]
}
A[i] = key;//基准元素放入正确位置
quicksort(A,L,i-1);//递归的排序左半部分
quicksort(A,i+1,R);//递归的排序右半部分
}


//输出数组元素
void element_show(int A[],int length){
int j;
for(j=0;j<length;j++){
        printf("%d\n",A[j]);
        }
}


int main()
{
        int A[5] = {2,4,6,1,0};
quicksort(A,0,5);//快速排序
element_show(A,5);//输出排序好的元素
return 0;
}


                                                      

0 0
原创粉丝点击