一.快速排序法
快速排序法建立在冒泡排序之上,對其進行了優化處理。同冒泡排序法,快速排序也是交換元素的位置。冒泡排序法每次將一個元素冒泡在數列的一端,因此效率過慢,其時間複雜度O(n^2)。
快速排序法原理爲:採取了遞歸了思想,選取一個基點元素,每一輪排序將小於/大於基點數值的數放在基點位置左邊,將大於/小於基點數值的數放在基點元素右邊。每一輪後,基點的位置將不會
改變。利用分割思想,將基點兩邊的元素看作兩個子數列,再次進行排序,直到排序完成。 原理圖如下
二.代碼分析於實現
代碼分析:將數列開始元素作爲基點元素pivot,用index表示基點位置,用left和right作爲遍歷指針元素,將數列按照從小到大排序。從指針right開始,把指針指向的元素與基點元素比較,如果
比pivot大,則指針左移;如果比pivot小,則把right指向元素填入index位置中。同理,left指針指向的元素小於pivot則left指針向右移動,如果left指針指向的元素大於pivot
則將left指向元素填入index位置中。最後left與right將會重合,此時index位置的元素將是最後一個需要交換位置的數值的值,將index位置的數值重新賦值爲pivot。over代碼實現:
import java.util.Arrays;
public class Sort {
public static void main(String arg[]){
int[] arr={4,7,6,3,2,8,4,5};
quickSort(arr, 0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr ,int startIndex,int endIndex)
{
if(startIndex>=endIndex)
{
return 0;
}
int pivotIndex=partition(arr,startIndexendIndex);
quickSort(arr, startIndex, pivotIndex-1);
quickSort(arr, pivotIndex+1, endIndex);//-1 & +1分割數列
}
private static int partition(int[] arr,int startIndex,int end_Index)
{
int pivot=arr[startIndex];
int left=startIndex;
int right=endIndex;
int index=startINdex;
while(right>=left){
while(right>=left){
if(arr[right]<pivot){
arr[left]=arr[right];
index=right;
left++;
break;
}
right--;
}
while(right>=left){
if(arr[left]>pivot){
arr[right]=arr[left];
index=left;
right--;
break;
}
left++;
}
}
arr[index]=pivot;
return index;
}
}
三.總結
快速排序法的時間複雜度時多大呢?值得思考,它是隨着數列元素初始排布的不同改變呢,還是不變?當然它是前者。
-----------------------趁年輕,多努力------------------------------