zoukankan      html  css  js  c++  java
  • 【算法】快速排序

    快速排序也是和归并排序一样是基于分治模式的,即将大问题划分为若干个小问题进行求解。

    比如这样一个数列:

    data[10] = {3,5,2,78,45,32,90,56,5,67}

    快速排序的思想是:

    1 先选定一个标记值,可以是集合中的任意一个元素

    2 将小于该标记值的元素都移动到标记值的左边,大于标记值的元素都移动到标记值的右边。

    然后再对左右的元素重复这个过程。

    以上数列

    3 5 2 78 4532 90 56 5 67

    对其进行排序:

    1 选定标记值比如 最后一个元素   67

    2 移动过程为:小于67向前面移大于67向后面移。

    前三次无需移动因为小于67

    第四次78大于67,但是它在前四个元素里面在最有边就不用移了。

    第五次 45小于67,需要移动到78的前面。

    3 5 2 45 7832 90 56 5 67

    第六次 32小于67需要移动到 78 的前面

    3 5 2 45 3278 90 56 5 67

    第七次 90 大于 67 无需移动

    3 5 2 45 3278 90 56 5 67

    第八次 56小于67需要移动到78的前面

    3 5 2 45 3256 90 78 5 67

    第九次 5 小于 67 需要移动到 90 的前面

    3 5 2 45 3256 5 78 90 67

    最后将67移动到5 的后面,这样就保证了67前面的所有元素都小于67,67后面的所有元素都大于67

    这样一次划分就完成了。

    以此类推,进行第二次划分

    。。。


    伪代码实现为:

    quikSort(A,p,r)
    if p < r
    	then q <---- PARTITION(A,p,r)
    	quikSort(A,p,q-1)
    	quikSort(A,q+1,r)
    
    PARTITION(A,p,r)
    x = A[r]
    i <----p - 1
    for j <---p to r-1
    	do if A[j] <= x
    	then i = i + 1;
    	swap(A[i],A[j])
    swap(A[i + 1],A[j]);
    return i + 1


    C代码实现为:

    #include <stdio.h>
    #include <stdlib.h>
    void quikSort(int *data, int p, int r);
    int PARTITION(int *data,int p,int r);
    
    int main()
    {
    int data[10] = {3,5,2,78,45,32,90,56,5,67};
    
    quikSort(data,0,9);
    int i = 0;
    for(i = 0; i < 10; i ++)
    {
    printf("%3d",data[i]);
    }
    return 0;
    }
    int PARTITION(int *data,int p,int r)
    {
    int x = data[r];
    int i = p -1;
    int temp = 0;
    int j = 0;
    for(j = p; j < r; j ++)
    {
            if(data[j] <= x)
            {
            i = i + 1;
            temp = data[i];
            data[i] = data[j];
            data[j] = temp;
    
    
            }
    }
    
    
    temp = data[i + 1];
    data[i + 1] = data[r];
    data[r] = temp;
    
    
    return i + 1;
    
    void quikSort(int *data, int p, int r)
    {
      if(p < r)
      {
            int q = PARTITION(data,p,r);
            int i = 0;
            for(i = 0; i < 10; i ++)
            {
            printf("%3d ",data[i]);
            }
            printf("\n");
            quikSort(data,p,q-1 );
            quikSort(data,q+1,r);;
       }
    }
    


  • 相关阅读:
    没有人可以阻碍我前进的脚步 , 遇佛杀佛,遇魔杀魔
    1/2 2008
    错过,用心
    公会平台
    久违的、讨厌的感觉
    CSS选择符
    jquery ajax
    2013年职业规划
    js小助手
    css 伪类
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3052990.html
Copyright © 2011-2022 走看看