快速排序算法的复杂度:
时间复杂度:O(n*lgn)
最坏:O(n^2)
空间复杂度:O(n*lgn)
不稳定
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程也可以递归进行,以此达到整个数据变成有序序列。
下标
|
0
|
1
|
2
|
3
|
4
|
5
|
数据
|
6
|
2
|
7
|
3
|
8
|
9
|
下标
|
0
|
1
|
2
|
3 |
4
|
5
|
数据
|
3
|
2
|
7
|
6
|
8
|
9
|
下标
|
0
|
1
|
2
|
3
|
4
|
5
|
数据
|
3
|
2
|
6
|
7
|
8
|
9
|
下标
|
0
|
1
|
2
|
3
|
4
|
5
|
数据
|
3
|
2
|
6
|
7
|
8
|
9
|
class
Quick
{
public
void
sort(
int
arr[],
int
low,
int
high)
{
int
l=low;
int
h=high;
int
povit=arr[low];
while
(l
{
while
(l=povit)//
数组从右开始比较数据和key值得大小
h--;
if
(l
int
temp=arr[h];
arr[h]=arr[l];
arr[l]=temp;
l++;
}
while
(l
l++;
if
(l
int
temp=arr[h];
arr[h]=arr[l];
arr[l]=temp;
h--;
}
}
print(arr);
System.out.print(
"l="
+(l+
1
)+
"h="
+(h+
1
)+
"povit="
+povit+
"\n"
);
if
(l>low)sort(arr,low,l-
1
);
if
(h
1
,high);
}
}
/*//////////////////////////方式二////////////////////////////////*/
更高效点的代码:
public
>
T[]quickSort(T[]targetArr,intstart,intend)
{
inti=start+
1
,j=end;
Tkey=targetArr[start];
SortUtilsUtil=newSortUtil();
if
(start>=end)
return
(targetArr);
/*从i++和j--两个方向搜索不满足条件的值并交换
*
*条件为:i++方向小于key,j--方向大于key
*/
while
(
true
)
{
while
(targetArr[j].compareTo(key)>
0
)j--;
while
(targetArr[i].compareTo(key)<
0
&&i
if
(i>=j)
break
;
sUtil.swap(targetArr,i,j);
if
(targetArr[i]==key)
{
j--;
}
else
{
i++;
}
}
/*关键数据放到‘中间’*/
sUtil.swap(targetArr,start,j);
if
(start
1
)
{
this
.quickSort(targetArr,start,i-
1
);
}
if
(j+
1
{
this
.quickSort(targetArr,j+
1
,end);
}
returntargetArr;
}
/*//////////////方式三:减少交换次数,提高效率/////////////////////*/
private
>
voidquickSort(T[]targetArr,intstart,intend)
{
inti=start,j=end;
Tkey=targetArr[start];
while
(i
{
/*按j--方向遍历目标数组,直到比key小的值为止*/
while
(j>i&&targetArr[j].compareTo(key)>=
0
)
{
j--;
}
if
(i
{
/*targetArr[i]已经保存在key中,可将后面的数填入*/
targetArr[i]=targetArr[j];
i++;
}
/*按i++方向遍历目标数组,直到比key大的值为止*/
while
(i
0
)
/*此处一定要小于等于零,假设数组之内有一亿个1,0交替出现的话,而key的值又恰巧是1的话,那么这个小于等于的作用就会使下面的if语句少执行一亿次。*/
{
i++;
}
if
(i
{
/*targetArr[j]已保存在targetArr[i]中,可将前面的值填入*/
targetArr[j]=targetArr[i];
j--;
}
}
/*此时i==j*/
targetArr[i]=key;
/*递归调用,把key前面的完成排序*/
this
.quickSort(targetArr,start,i-
1
);
/*递归调用,把key后面的完成排序*/
this
.quickSort(targetArr,j+
1
,end);
}