Java排序算法(五):快速排序
快速排序是一个速度非常快的交换排序算法,它的基本思路很简单,从待排的数据序列中任取一个数据(如第一个数据)作为分界值,所有比它小的数据元素放到左边,所有比它大的数据元素放到它的右边。经过这样一趟下来,该序列形成左右两个子序列,左边序列中的数据元素的值都比分界值小,右边序列中数据元素的值都比分界值大。
接下来对左右两个子序列进行递归排序,对两个子序列重新选择中心元素并依此规则调整,直到每个元素子表的元素只剩下一个元素,排序完成。
思路:
1.定义一个i变量,i变量从左边第一个索引开始,找大于分界值的元素的索引,并用i来记录它。
2.定义一个j变量,j变量从右边第一个索引开始,找小于分界值的元素的索引,并用j来记录它。
3.如果i
重复执行以上1,2,3步,直到i>=j,可以判断j左边的数据元素都小于分界值,j右边的数据元素都大于分界值,最后将分界值和j索引处的元素交换即可。
时间复杂度
最好情况(每次总是选到中间值作枢轴)T(n)=O(nlogn)
最坏情况(每次总是选到最小或最大元素作枢轴)
做n-1趟,每趟比较n-i次,总的比较次数最大:[O(n²)]
平均时间复杂度为::T(n)=O(nlogn)
代码实现:
packagesort;
publicclassQuickSortTest {
publicstaticvoidmain(String[] args) {
int[] data =newint[] {5,3,6,2,1,9,4,8,7};
print(data);
quickSort(data,0, data.length -1);
System.out.println("排序后的数组:");
print(data);
}
publicstaticvoidswap(int[] data,inti,intj) {
if(i == j) {
return;
}
data[i] = data[i] + data[j];
data[j] = data[i] - data[j];
data[i] = data[i] - data[j];
}
publicstaticvoidquickSort(int[] data,intstart,intend) {
if(start >= end)
return;
//以起始索引为分界点
intpivot = data[start];
inti = start +1;
intj = end;
while(true) {
while(i <= end && data[i] < pivot) {
i++;
}
while(j > start && data[j] > pivot) {
j--;
}
if(i < j) {
swap(data, i, j);
}else{
break;
}
}
//交换 j和分界点的值
swap(data, start, j);
print(data);
//递归左子序列
quickSort(data, start, j -1);
//递归右子序列
quickSort(data, j +1, end);
}
publicstaticvoidprint(int[] data) {
for(inti =0; i < data.length; i++) {
System.out.print(data[i] +"\t");
}
System.out.println();
}
}
运行结果:
536219487
134259687
134259687
123459687
123457689
123456789
排序后的数组:
123456789
Java排序算法(六):直接插入排序
直接插入排序的基本操作就是将待排序的数据元素按其关键字值的大小插入到前面的有序序列中。
直接插入的时间效率并不高,如果在最坏的情况下,所有元素的比较次数总和为(0+1+...+n-1)=O(n^2)。其他情况下也要考虑移动元素的次数,故时间复杂度为O(n^2)
直接插入空间效率很好,只需要1个缓存数据单元,也就是说空间复杂度为O(1).
直接插入排序是稳定的。
直接插入排序在数据已有一定顺序的情况下,效率较好。但如果数据无规则,则需要移动大量的数据,其效率就与冒泡排序法和选择排序法一样差了。
算法描述
对一个有n个元素的数据序列,排序需要进行n-1趟插入操作:
第1趟插入,将第2个元素插入前面的有序子序列--此时前面只有一个元素,当然是有序的。
第2趟插入,将第3个元素插入前面的有序子序列,前面2个元素是有序的。
第n-1趟插入,将第n个元素插入前面的有序子序列,前面n-1个元素是有序的。
代码实现
packagesort;
publicclassInsertSortTest {
publicstaticintcount =0;
publicstaticvoidmain(String[] args) {
int[] data =newint[] {5,3,6,2,1,9,4,8,7};
print(data);
insertSort(data);
print(data);