快速排序算法

来源:互联网 发布:照片修复软件免费版 编辑:程序博客网 时间:2024/06/05 21:02

    到深圳后,就没有到CSDN上来了。每天工作很晚,但感觉无所收获,要说有收获,就是知道工作不是按自己的意愿而安排的。知道自己在以后的日志里。该合理安排自己的业余生活。下一个工作已经找到,新公司应该不错的,这一次不会在跳了。在工作中好好表现吧。

 

最近复习了几个常用的排序算法,说是复习,其实以前就没有搞懂了。哈哈。。。

快速算法,按书上的伪代码写下来还是让我调试了好久,最终搞定。。。

 

过程大致如下:

给一个序列,就说成数组吧,习惯了。要对该数组进行排序。

快速排序采用的是分治法进行排序的,即把一个大数组分成一个小数组,在对小数组进行划分,最终变成了只有一个元素的数组当然是排好序的了。

 

划分的时候其实就是在进行排序操作。将大的放在一边,小的放在一边。什么叫做大的,什么叫做小的呢。就是和某个数相比较。这个数一般我们可以取数组的第一个元素或为了提高效益使数组划分对称写,可以采用一些算法。这就不说了。

 

先看看快速排序的伪代码:

 

QuikSort(A,p,r)

{

    if(p < r)

    {

       int q = Partition(A,p,r);

       QuikSort(A,p,q);

       QuikSort(A,q + 1,r);

    }

}

上面就是快速排序的伪代码了。就是对一个数组不停的划分。关键部分就是Partition了,该函数在进行划分的时候就实现了排序功能。

 

int Partition(int A[], int p, int r)

{

    int i = p;

    int j = r;

    int key = A[p];

 

    while(true)

    {

          while((j > p) &&(A[j] >= key))//书上没有加j>p、i < r说不会出现这种情况,让读者自己证明,但是我写的代码不加好像不行

          {//而且若果此处不判断=好好像也不行啊,会使循环

               --j;

          }

 

          while((i < r) && (A[i] < key))

          {

                ++i;

          }

 

         if(i < j)

         {

              if(key == A[j])//不判断这种情况会使循环的,发生在数组中出现相同大小的数时

              {

                   ++i;

                   continue;

              }

 

             int tmp = A[i];

            A[i] = A[j];

            A[j] = tmp;

         }

         else

         {

              return j;

         }

    }

}

 

总结:在看书上的算法时,看懂了。想到应该不难。但是自己着手写代码时,才发现按书上的伪代码并不能够实现。还要自己处理一些情况的。开始时我在while j 或 while i的循环中 都带上 = 号 ,发现结果不对 。然后都去掉 发现结果还是不对,最后就形成了现在的代码 。还有效的解决了数组中出现重复数字的情况 。妙哉妙哉  哈哈

 

 

 

 

 

原创粉丝点击