快速排序
基本思想:任取待定排序序列中的某个元素作为标准(一般取第一个元素),通过一次划分,将待排元素分为左右两个子序列,左子序列中元素小于基准元素,右子序列大于或等于基准元素,然后对两个子序列继续进行划分,直至每一个序列只有一个元素为止。
时间效率:
O(log2(n+1))
O
(
l
o
g
2
(
n
+
1
)
)
空间效率:
O(nlog2n)
O
(
n
l
o
g
2
n
)
算法稳定性:不稳定
//快速排序
public class Sort_f {
private void fastSort(int nums[],int start,int end){
if(start<end){
int i = start;//左指针
int j = end;//右指针
int key = nums[start];//关键元素(用来比较的元素)
while(i<j){
while(i<end && nums[++i]<key);//找到一个左边大于关键元素的数组元素
while(j>end && nums[j]>key)j--;//找到一个右边小于关键元素的数组元素
if(i<j){
swap(nums,i,j);
}
}
//递归
swap(nums,start,j);
fastSort(nums,start,i-1);
fastSort(nums,j+1,end);
}
}
//交换函数
private void swap(int nums[],int i,int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
//测试主函数
public static void main(String[] args) {
int nums[]={7,4,6,5,4,4,3,2,1};
Sort_f test = new Sort_f();
int length = nums.length;
test.fastSort(nums,0,length-1);
System.out.println(java.util.Arrays.toString(nums));
}
}