快速排序是,快速排序为什么叫快速排序
快速排序是对冒泡排序的改进。快速排序是由fzdgb在1960年提出的。
算法的思想是将待排序的数据按照一次排序分成两个独立的部分,其中一部分的所有数据小于其他部分的所有数据,然后用这种方法对两部分的数据进行快速排序,对整个排序过程进行递归排序。
排序是通过多次比较交换快速排序实现的,排序过程如下
1.首先设置边界值,根据边界值将数组分为左右两部分。
2.将高于边界值的数据收集到数组的右侧,将低于边界值的数据收集到数组的左侧。此时,左边部分的所有元素都低于边界值,右边部分的所有元素都高于边界值。
3.然后,左右数据可以独立排序。对于左边的数组数据,可以取另一个边界值,把这部分数据从左边分开。同样,您可以在左侧放置一个小值,在右侧放置一个大值。右边的数组数据也可以用同样的方式处理。
4.重复上面的过程,你会发现这是一个递归定义。左半部分递归排序后,右半部分递归排序。将左右两部分的每个数据排序后,整个数组的排序也就完成了。
一言以蔽之,这就是基于挖坑的划分规则。
快速排序算法中有三个主要参数,左为区间的起始地址,右为区间的结束地址,Key为当前的起始值。
从要排序的记录序列中,选择基准元素(称为key的记录)。在key=arr[left]中,设置两个变量,left指向序列的最左边,right指向数据的最右边。
第一步,将key与arr[right]进行对比。对于键,arr[left]=arr[right]将比该键小的数字放在左边。对于arr[right]键,只需将right -放在左边。
第二步如果右边有arr[right]键,设置为arr[left ]=arr[right],然后向左改变方向,比较arr[left ]和key,比较arr[left]键的
第三步。向右移动,重复上述步骤。
第四步最后得到{23 58 13 10 57 62} 65 {106 78 95 85},对左右子序列做同样的操作。最后得到一个有序序列。
{23 58 13 10 57 62} 65 {106 78 95 85}
{10 13} 23 {58 57 62} 65 {85 78 95} 106
10 13 23 57 58 62 65 78 85 95 106
借用五次算法的gif动画,感谢五次算法。
首先对数列中的所有数字进行操作,从所有数字中选择一个数字作为排序的枢纽。枢轴通常是随机选择的。这里为了演示方便,选择最右边的数字作为支点,选择支点,然后选择运算序列中最左边的数字作为左标记。最右边的数字标记将左边的标记与右边的标记一起向右移动。当左标记超过枢轴数时,在此停止移动。6所以,停止移动后,将右边的标记向左移动。当右边的标记变成一个比pivot小的数字时,在这里停止移动。6所以,别动了。左右标记停止后,更改标记的数量。所以左记号的作用是找出大于pivot的数。右边的标记用于查找小于pivot的数字。通过交换数字,可以在数列的左侧收集一组小于pivot的数字。收集并交换大于pivot的数字集合后向右移动,继续移动此处的左侧标记。9,6,所以停止移动,然后将右边的标记向左移动。当右标记接触左标记时,它也停止移动。如果左标记和右标记停止,并且都在相同的位置,将此数字与枢轴数交换。这是第一次所有小于6的数字都在6的右边。理想的做法是递归地对这两个部分执行相同的操作,以完成快速排序的性能和时间复杂度。那么就是
期望每次都把数组都分成平均的两个部分
。根据这种理想情况,在对N个数进行排序时,设N次比较所需的时间为t(n),树的深度可以由下式得到t(n ) 2t ) n/2 ) n,t)1)0t)n)2t)n/2)n=4t)n/4)2nt(n(4)2t(n/8(n/4))))
当我们比较的次数变成
空间复杂度原地排序原地快排的空间占用是递归造成的栈空间的使用,最好情况下是递归次,所以空间复杂度为,最坏情况下是递归n-1次,所以空间复杂度是。
非原地排序对于非原地排序,每次递归都要声明一个总数为n的额外空间,所以空间复杂度变为原地排序的n倍,即最好情况下,最差情况下。
稳定性
不稳定
。代码实现C和C void QuickSort(int array[],int low,int high){ int I=low;int j=高;if(I=j){ return;} int temp=array[low];而(我!=j){ while(array[j]=temp I j){ j-;} while(array[I]=temp I j){ I;}if(i j) { swap(array[i],array[j]);} } //将基准临时雇员放于自己的位置,(第我个位置)swap(array[low],array[I]);快速排序(数组,低位,I-1);快速排序(数组,i 1,高);} Java public static int[]qsort(int arr[],int start,int end){ int pivot=arr[start];int I=start int j=end while(ij){ while((ij)(arr[j]pivot)){ j-;} while((ij)(arr[I]pivot)){ I;} if((arr[I]==arr[j])(ij)){ I;} else { int temp=arr[I];arr[I]=arr[j];arr[j]=temp;} } if (i-1start) arr=qsort(arr,start,I-1);if (j 1end) arr=qsort(arr,j 1,end);返回(arr);} Python def swap(arr,I,j): arr[i],arr[j]=arr[j],arr[i]def partition(arr,left,right):pivot=left index=I=index while I=right:if arr[I]arr[pivot]:swap(arr,I,index) index=1 i=1 swap(arr,pivot,index-1)return index-1 def快速排序(arr,left=None,right=None):left=0 if not is instance(left,(int,float))else left right=len(arr)-1