Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3057
  • 博文数量: 1
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-04 10:04
个人简介

珍惜现在拥有的所有,做自己就好,不羡慕,不嫉妒。

文章分类
文章存档

2015年(1)

我的朋友
最近访客

分类: Java

2015-05-23 11:50:54

首先介绍一下quicksort:   
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然 后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
                                                                                                               -------- 来自百度百科
    说白了,快速排序就是一种分区交换排序,冒泡排序的改进,采用分而治之的思想。快速排序首先将一个数分成两个较小的子序列:低元素和高元素。然后又分别快速对子序列递归调用,直至排序完成。
    一般步骤:
        1)选择一个元素pivot(枢轴、支点),一般枢轴pivot取中间索引元素。(当然你也可以任意取)
        2)再定义两个变量left,right分别从数组的左右向pivot扫描,当left角标所在的值大于right角标所在的值时,交换数值,直到left>=right,一次快排就结束了,这就是所谓的分区操作。
        3)递归应用上述步骤,直至排序完成。

下面用java、c完成代码(只要理解了,什么语言写并不重要)
java代码如下:

点击(此处)折叠或打开

  1. /*=============================================================================
  2. # FileName: QuickSort.java
  3. # Desc: 快速排序(java)
  4. # Author: Icheon Tao
  5. # Email: icheon_tao0@sina.com
  6. # HomePage: http://blog.chinaunix.net/uid/30232980.html
  7. # Version: 0.0.1
  8. # LastChange: 2015-05-22 21:13:07
  9. # History:
  10. =============================================================================*/

  11. public class QuickSort {

  12.     /**
  13.      * @Synopsis 快速排序方法
  14.      *
  15.      * @Param data
  16.      *
  17.      * @Returns
  18.      */
  19.     public static void quickSort(int[] data) {
  20.         quickSort(data,0,data.length-1);
  21.     }

  22.     /**
  23.      * @Synopsis quickSort(重载quickSort方法)
  24.      * @Param data
  25.      * @Param lowerIndex
  26.      * @Param higherIndex
  27.      * @Returns
  28.      */
  29.     public static int[] quickSort(int[] data,int lowerIndex,int higherIndex) {

  30.         int left = lowerIndex;
  31.         int right = higherIndex;
  32.         int pivot = data[lowerIndex+(higherIndex-lowerIndex)/2]; // 这里用中间的当做枢轴pivot
  33.         while (left <= right) { // 该循环将data数组分为两个数组进行排序
  34.             while(data[right] > pivot) { // 从数组的右边依次往左遍历。直到找到比枢轴pivot小的数
  35.                 right--;
  36.             }
  37.             while(data[left] < pivot) { // 从数组的左边依次往右遍历。直到找到比枢轴pivot大的数
  38.                 left++;
  39.             }
  40.             if (left <= right) { // 如果找到了并且i<=j,就进行交换
  41.                 exchangeNumElement(data,left,right);
  42.                 left++;
  43.                 right--;
  44.             }
  45.         }
  46.         if(lowerIndex < right) { // 分为两部分后继续递归调用quickSort
  47.             quickSort(data,lowerIndex,right);
  48.         }
  49.         if(left < higherIndex) {
  50.             quickSort(data,left,higherIndex);
  51.         }
  52.         return data;
  53.     }

  54.     /**
  55.      * @Synopsis 用于交换数组的角标
  56.      *
  57.      * @Param a
  58.      * @Param b
  59.      *
  60.      * @Returns
  61.      */
  62.     public static void exchangeNumElement(int[] data,int a,int b) {

  63.         int temp = data[a];
  64.         data[a] = data[b];
  65.         data[b] = temp;
  66.     }

  67.     /**
  68.      * @Synopsis 遍历输出数组
  69.      *
  70.      * @Param data
  71.      *
  72.      * @Returns
  73.      */
  74.     public static void printArray(int[] data) {
  75.         for(int i = 0;i < data.length;i++) {
  76.             System.out.print(data[i]+" ");
  77.         }
  78.     }

  79.     /**
  80.      * @Synopsis main方法,程序入口
  81.      *
  82.      * @Param args
  83.      *
  84.      * @Returns
  85.      */
  86.     public static void main(String[] args) {

  87.         int[] intArray = new int[10];
  88.         for(int i = 0;i < intArray.length;i++) {
  89.             intArray[i] = (int)(Math.random()*100+1);
  90.         }
  91.         quickSort(intArray);

  92.         printArray(intArray);
  93.     }
  94. }
  c代码如下:

点击(此处)折叠或打开

  1. /*=============================================================================
  2. # FileName: QuickSort.c
  3. # Desc: 快速排序之c篇
  4. # Author: Icheon Tao
  5. # Email: icheon_tao0@sina.com
  6. # HomePage: http://blog.chinaunix.net/uid/30232980.html
  7. # Version: 0.0.1
  8. # LastChange: 2015-05-23 11:54:25
  9. # History:
  10. =============================================================================*/
  11. #include<stdio.h>

  12. /**
  13.  * @Synopsis 交换数组中的两个元素的值
  14.  *
  15.  * @Param data
  16.  * @Param a
  17.  * @Param b
  18.  */
  19. void exchangeNumElement(int *data,int a,int b) {
  20.     
  21.     int temp = data[a];
  22.     data[a] = data[b];
  23.     data[b] = temp;
  24. }
  25. /**
  26.  * @Synopsis QuickSort函数
  27.  *
  28.  * @Param p
  29.  * @Param lowerIndx
  30.  * @Param higherIndex
  31.  */
  32. void quickSort (int *data,int lowerIndex,int higherIndex) {

  33.     int left = lowerIndex;
  34.     int right = higherIndex;
  35.     int pivot = data[lowerIndex+(higherIndex-lowerIndex)/2];

  36.     while (left <= right) { // 该循环将data数组分为两个数组进行排序
  37.             while(data[right] > pivot) { // 从数组的右边依次往左遍历。直到找到比pivot小的数
  38.                 right--; //
  39.             } //
  40.             while(data[left] < pivot) { // 从数组的左边依次往右遍历。直到找到比pivot大的数
  41.                 left++; //
  42.             } //
  43.             if (left <= right) { // 如果找到了并且i<=j,就进行交换
  44.                 exchangeNumElement(data,left,right); //
  45.                 left++; //
  46.                 right--; //
  47.             } //
  48.         } //
  49.         if(lowerIndex < right) { // 分为两部分后继续递归调用quickSort
  50.             quickSort(data,lowerIndex,right);
  51.         }
  52.         if(left < higherIndex) {
  53.             quickSort(data,left,higherIndex);
  54.         }
  55.     }


  56. /**
  57.  * @Synopsis main函数-->程序入口
  58.  *
  59.  * @Returns
  60.  */
  61. int main() {
  62.     int i = 0;
  63.     int array[] = {4,9,2,5,6,1,7,3,8,0};
  64.     int length = sizeof(array)/sizeof(array[0]);
  65.     quickSort(array,0,length-1);
  66.     for (i = 0;i < length;i++) {
  67.         printf("%d ",array[i]);
  68.     }
  69.     return 0;
  70. }

 
   
                                                                                            -------- 只想记录自己的自学之路

阅读(355) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~