数据结构值排序算法(三)-快速排序

原创 2015年12月23日 11:17:37
基本思想:

快速排序采用的思想是分治思想。

第一趟排序:快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。

递归排序:第二步就是对高段位和地段为两部分进行递归排序。

一趟快速排序的算法的步骤是:
1)设置两个变量low、high,排序开始的时候:low=0,high=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从high开始向前搜索,即由后开始向前搜索(high--),找到第一个小于key的值A[high],将A[high]和A[low]互换;
4)从i开始向后搜索,即由前开始向后搜索(low++),找到第一个大于key的A[low],将A[low]和A[high]互换;
5)重复第3、4步,直到low=high

一趟快速排序的算法的图解是:


QuickSortClass.java

public class QuickSortClass {
   private int[] array;

   public int[] getArray() {
	   return array;
   }

   public void setArray(int[] array) {
	   this.array = array;
   }
   //快速排序  
   public void quikSort(){  
       QuikSort(0,array.length-1);  
   }  
 
   //递归的快速排序 
   private void QuikSort(int low,int high){  
       if(low>=high){  
              return;  
       }else{  
              int pivot = array[low];  //以第一个元素为基准  
              int partition =partition(low,high,pivot);  //对数组进行划分,比pivot小的元素在低位段,比pivot大的元素在高位段  
              
              QuikSort(low,partition-1);   //对划分后的低位段进行快速排序  
              QuikSort(partition+1,high);  //对划分后的高位段进行快速排序  
       }  
   }  
 

   //以pivot为基准对下标low到high的数组进行划分 ,low 数组段的最小下标 ,high 数组段的最大下标 , pivot 划分的基准元素 , 划分完成后基准元素所在位置的下标 
   private int partition(int low,int high,int pivot){  
        
       while(low<high){               
              while(low<high &&array[high]>=pivot){  //从右端开始扫描,定位到第一个比pivot小的元素  
                     high--;  //如果array[high]比基准pivot大,就不管,继续向前移动
              }  
              swap(low,high);  //如果array[high]比基准pivot小,就交换low和high
               
              while(low<high &&array[low]<=pivot){  //从左端开始扫描,定位到第一个比pivot大的元素  
                     low++;    //如果array[low]比基准pivot小,就不管,继续向后移动
              }  
              swap(low,high);  //如果array[low]比基准pivot大,就交换low和high 
               
       }  
       return low;  
        
}  
   //交换数组中两个元素的数据 
   private void swap(int low,int high){  
       int temp = array[high];  
       array[high] = array[low];  
       array[low] = temp;  
   }  
}


TestQuickSort.java

public class TestQuickSort {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
       int[] list={25,24,6,65,11,43,22,51};
       QuickSortClass qs=new QuickSortClass();
       System.out.println("快排前的数组是:");
       for(int i=0;i<list.length;i++){
    	   System.out.print(list[i]+" ");
       }
      qs.setArray(list);
      qs.quikSort();
      int[] list2= qs.getArray();
       System.out.println();
       System.out.println("快排后的数组是:");
       for(int i=0;i<list2.length;i++){
    	   System.out.print(list2[i]+" ");
       }
	}
}


算法分析:

在最差的情况下,划分有n个元素构成的数组需要进行n次比较和n次移动,因此划分所需的时间为O(n).在最差的情况下,每次主元会将数组划分成为一个大数组和一个空数组。这个大数组的规模是在上次划分的基础上减一。该算法需要(n-1)+(n-2)+...+2+1=O(n2).

在最佳的情况下,每次主元会将数组划分成为规模大致相等的部分。设T(n)标识使用快速排序算法堆包含n个元素的数组排序所需要的时间,因此

                        T(n)=T(n/2)+T(n/2)+n

快速排序的T(n)=O(nlogn)


版权声明:本文为博主原创文章,未经博主允许不得转载。

数据结构——快速排序算法

今天来说一说快速排序:基本思想: 任取一个元素 (如第一个) 为轴点 所有比它小的元素一律前放,比它大的元素一律后放,形成左右两个子表 对各子表重新选择中心元素并依此规则调整,直到每个子表的元素只剩一...
  • u013271921
  • u013271921
  • 2015年05月25日 20:14
  • 1471

数据结构之快速排序

#include using namespace std;//  快速排序的实现基于分治法,具体分为三个步骤。假设待排序的序列为L[m..n]。//  分解:序列L[m .. n]被划分成两个可能为空...
  • Last_Impression
  • Last_Impression
  • 2009年05月16日 15:54
  • 4367

数据结构例程—— 交换排序之快速排序

本文是[数据结构基础系列(9):排序]中第5课时[ 交换排序之快速排序]的例程。1.以第1个元素作为基准#include #define MaxSize 20 typedef int KeyType...
  • sxhelijian
  • sxhelijian
  • 2015年11月30日 15:37
  • 1805

【数据结构与算法】内部排序之四:归并排序和快速排序(含完整源码)

之所以把归并排序和快速排序放在一起探讨,很明显两者有一些相似之处:这两种排序算法都采用了分治的思想。下面来逐个分析其实现思想。 归并排序 实现思想 归并的含义很明显就是将两...
  • mmc_maodun
  • mmc_maodun
  • 2014年03月06日 00:02
  • 7419

数据结构各种排序法及核心思想(冒泡、鸡尾酒、选择、插入、二分法、希尔、堆、归并、快速)

#include #define N 10 void swap(int a[],int i,int j) { int tmp = a[i]; a[i] = a[j]; a[j] ...
  • qq_39482521
  • qq_39482521
  • 2017年08月06日 23:56
  • 184

数据结构 - 快速排序(Quick Sort) 详解 及 代码(C++)

快速排序(Quick Sort) 详解 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 快速排序(Quick Sort): 通过一趟排序...
  • u012515223
  • u012515223
  • 2014年04月25日 17:18
  • 4196

数据结构与算法分析笔记与总结(java实现)--排序5:快速排序练习题

数据结构与算法分析笔记与总结(java实现)--排序5:快速排序练习题
  • qq_27703417
  • qq_27703417
  • 2017年02月15日 17:08
  • 291

数据结构+算法系列五:I 快速排序

先整理下思路。
  • sangyongjia
  • sangyongjia
  • 2014年06月18日 23:27
  • 914

数据结构(4)快速排序

本篇文章介绍时间复杂度同样为O(nlgn)但是排序速度比合并排序更快的快速排序(Quick Sort)。 快速排序是20世纪科技领域的十大算法之一 ,他由C. A. R. Hoare于1960年...
  • u011225629
  • u011225629
  • 2015年08月10日 19:15
  • 888

【数据结构和算法13】快速排序

上一节我们学习了一个高级排序算法:希尔排序,这一节我们将讨论另一个高级排序算法:快速排序。         快速排序算法是最流行的排序算法,因为有充足的理由,在大多数情况下,快速排序都是最快的,执行...
  • eson_15
  • eson_15
  • 2016年04月16日 21:00
  • 2609
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构值排序算法(三)-快速排序
举报原因:
原因补充:

(最多只允许输入30个字)