分治法之快速排序算法解题思路

快速排序算法的基本思想是:先找一个基准元素(比如待排序数组的第一个元素),进行一趟快速排序,使得该基准元素左边的所有数据都它小,而右边的所有数据都它大,然后再按此方法,对左右两边的数据分别进行快速排序,整个排序过程可以 递归 进行,以此达到整个数组变成有序 序列
比如我们现在对序列arr={-2,6,88,0,-4,56}这6个数进行排序:
0 1 2 3 4 5
-2 6 88 0 -4 56
首先选基准元素 key=arr[0]即-2,变量i保存数组arr首个下标,j保存arr最后一个下标,即:i=0; j=5;

首先向左移动 j ,直到它已经移到最左边,或者找到一个数,使得arr[j] <= key,比如这里j在向左移动,然后它发现移到下标4的时候,对应元素的值为-4,符合条件,就和arr[i]交换了元素的内容,即将-4换到左边-2的位置:

接下来移动 i 了:它会向右移,直到它已经移到最右边,或者找到一个数,使得arr[i]>key,那么这里i发现移到下标1的时候,对应元素为6,大于key,ok,与arr[j]交换元素的值,结果如下:


然后又到j移动了,它发现移到下标1的时候,对应元素的值<=key,就停下来,然后判断,却发现i和j碰头了,所以不交换了:


至此第一趟快速排序结束了,我们可以发现,到目前为止,基准元素-2现在在下标1那里,而它左边的每一个元素{-4}都比它小,而右边的每一个元素{88,0,6,56}都比它大,当然,被分隔出来的这两个序列目前还是无序的,所以我们接下来的任务就是分别对这两个序列进行快速排序,如此递归下去,直到整个数组成为一个有序序列:

由于左边序列{-4}只有一个元素了,那就不用排序了,所以轮到右边序列{88,0,6,56}排序:

同样选基准元素key=88,i指向88对应的位置,j指向56对应的位置:


然后又是跟之前一样将这个序列排成:

{56,0,6,88}

然后,我们又完成了一次快速排序,接下来的任务,就是对基准元素88左右两个序列继续排对吧?,也就是对{56,0,6}继续排,因为88右边没有元素了,所以它右边就不需要递归了..........

最终结果:


另外,附上排序全过程:

原始序列:arr[]={-2,6,88,0,-4,56}



好了,思路介绍到这,又是源码了,还是那句话,若有问题,欢迎各位小伙伴指出哈:

#include <iostream>
#include <string>
using namespace std;

void swap(int i,int j,int arr[]){
     int t;
     t=arr[i];arr[i]=arr[j];arr[j]=t; 
        for(int i=0;i<6;i++){
          cout << arr[i] << " ";
          }
          cout << endl;
           
     }


void quicksort(int p,int q,int arr[],int key){
    int i,j;
    i=p;
    j=q;
    if(p>=q){
         return;
         }
    
    while(1){
            while(j>=p && arr[j]>key){j--;}
            if(j<=i) 
            break;
            swap(i,j,arr);
            
            while(i<=q && arr[i]<=key){i++;}                                  
            if(j<=i) 
            break;
            swap(i,j,arr);
            
            }
            
     quicksort(p,j-1,arr,arr[p]);
     quicksort(j+1,q,arr,arr[j+1]);   
    
    }


int main(){
    int arr[]={-2,6,88,0,-4,56};
    int j;
    quicksort(0,5,arr,arr[0]);

    for(int i=0;i<6;i++){
          cout << arr[i] << " ";
          }
          cout << endl;
          system("pause");
    return 0;
    }



猜你喜欢

转载自blog.csdn.net/qq_32919451/article/details/80640231