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

基本思想:

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

第一趟排序:快速排序是找出一个元素(理论上可以随便找一个)作为基准(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)

时间: 2024-07-31 12:03:31

数据结构值排序算法(三)-快速排序的相关文章

排序算法&lt;三&gt;快速排序

#include<iostream> #include<cstdio> using namespace std; void swap(int arr[], int i, int j){ int t=arr[i]; arr[i]=arr[j]; arr[j]=t; } int partition(int arr[], int low, int end){ int i=low; int j=end+1; int x=arr[low]; while (1){ while (i<en

数据结构-各类排序算法总结[续]

各类排序算法总结 三.交换类排序[接上] 2.快速排序 快速排序是通过比较关键码.交换记录,以某个记录为界(该记录称为支点),将待排序列分成两部分.其中,一部分所有记录的关键码大于等于支点记录的关键码,另一部分所有记录的关键码小于支点记录的关键码.我们将待排序列按关键码以支点记录分成两部分的过程,称为一次划分.对各部分不断划分,直到整个序列按关键码有序. 如果每次划分对一个元素定位后,该元素的左侧子序列与右侧子序列的长度相同,则下一步将是对两个长度减半的子序列进行排序,这是最理想的情况! [算法

数据结构—各类‘排序算法’实现(上)

数据结构中的排序算法分为比较排序,非比较排序.比较排序有插入排序.选择排序.交换排序.归并排序,非比较排序有计数排序.基数排序.下面是排序的具体分类: 1.直接排序 主要思想:使用两个指针,让一个指针从开始,另一个指针指向前一个指针的+1位置,两个数据进行比较 void InsertSort(int* a, size_t size) {      assert(a);      for (size_t i = 0; i < size - 1; i++)      {           int 

数据结构-各类排序算法总结[结局]

各类排序算法总结 五.分配类排序->基数排序: 基数排序是一种借助于多关键码排序的思想,是将单关键码按基数分成"多关键码"进行排序的方法.基数排序属于"低位优先"排序法,通过反复进行分配与收集操作完成排序. 对于数字型或字符型的单关键字,可以看成是由多个数位或多个字符构成的多关键字, 此时可以采用这种"分配-收集"的办法进行排序,称作基数排序法.其好处是不需要进行关键字间的比较. 例如:对下列这组关键字{278, 109, 063, 930

数据结构-各类排序算法总结

各类排序算法总结 一. 排序的基本概念 排序(Sorting)是计算机程序设计中的一种重要操作,其功能是对一个数据元素集合或序列重新排列成一个按数据元素某个项值有序的序列. 有 n 个记录的序列{R1,R2,-,Rn},其相应关键字的序列是{K1,K2,-,Kn},相应的下标序列为1,2,-,n.通过排序,要求找出当前下标序列1,2,-, n 的一种排列p1,p2, -,pn,使得相应关键字满足如下的非递减(或非递增)关系,即:Kp1≤Kp2≤-≤Kpn,这样就得到一个按关键字有序的记录序列{R

【数据结构】——排序算法——3.1、选择排序

      [数据结构]--排序算法--3.1.选择排序 一.先上维基的图: 分类 排序算法 数据结构 数组 最差时间复杂度 О(n2) 最优时间复杂度 О(n2) 平均时间复杂度 О(n2) 最差空间复杂度 О(n) total, O(1)auxiliary 二.描述: 选择算法算是最直观的一个了.每次在队列里抽取一个极大(或极小)值进行排列.每次都需要遍历未被抽取的元素队列. 三.Java程序: static void selection_sort(int[] unsorted) { for

【数据结构】——排序算法——1.1、直接插入排序

插入算法很多,无论是在内功修炼,各种笔试面试都是相当有用的.接下来,将陆续将各种排序算法进行练习: 主要分为以下几个部分(其他后面学习补充): 一.插入类排序:1.直接插入排序:2.折半插入排序:3.希尔shell排序: 二.交换类排序:1.冒泡排序 :2.快速排序: 三.选择类排序:1.简单选择: 2.堆排序: 本人多使用Java--开始吧! 首先推荐1.维基百科<排序算法>词条,图文并茂,很形象!2.学习博文<维基百科上的算法和数据结构链接很强大>,资料很多,保存学习! [数据

排序算法之快速排序(Quicksort)解析

一.快速排序算法的优点,为什么称之为快排? Quicksort是对归并排序算法的优化,继承了归并排序的优点,同样应用了分治思想. 所谓的分治思想就是对一个问题“分而治之”,用分治思想来解决问题需要两个步骤: 1.如何“分”?(如何缩小问题的规模) 2.如何“治”?(如何解决子问题) 快排的前身是归并,而正是因为归并存在不可忽视的缺点,才产生了快排.归并的最大问题是需要额外的存储空间,并且由于合并过程不确定,致使每个元素在序列中的最终位置上不可预知的.针对这一点,快速排序提出了新的思路:把更多的时

排序算法 之 快速排序

快速排序是基于分治思想的一种排序算法,就像该方法的名字一样,速度比较快,所以叫做快速排序:它的平均时间复杂度为O(N*logN),最坏时间复杂度为O(n2),由于快速排序在序列元素数量多的时候速度比较快,所以很多语言内置的排序方法也是用快速排序实现的.快速排序也有很多优化的版本,比如在排序时基数的选择等等-下面就说一下一般的快速排序的实现. 基本思想: 快速排序的基本思想就是,先从待排序的序列中任选一个元素作为基数,然后将序列中的其他小于基数的元素放在基数的左边,大于或等于基数的元素放在基数的右