3 5 4 1 2 6 8 7 9
1.找Pivot——》左边第一个(即3)
2.i,j——》Pivot后一个(即5)
3.移动两个指针要保证:
(1)i左边的数<Pivot
(2)让[i,j]>Pivot
4.
(1)如果num[j]>Pivot——》j++;
(2)如果num[j]<Pivot——》(1)交换i,j
(2)i++,j++;
详细步骤:
5.交换pivot和num[i-1]
把3左右的两个子排序队列,再进行相同的步骤进行排序。
数组快速排序代码实现。
public static void quickSort2(int[] array){
subSort(array,0,array.length-1);
}
public static void subSort(int[] array,int low,int high){
//选定第一个元素作为pivot
//指针i,指针j从第二个元素出发使得:
//指针左边的都小于pivot,指针j中间的(包括i,j)都大于pivot
//j指针比i跑得快,j到达最后一个
if(low<high){
int pivot=array[low];
int i=low+1;
int j=low+1;
while(j<=high){
//一开始i,j同步一直到第一个比pivot大的数出现,i停下了
if(array[i]<pivot){
swap(array,i,j);
i++;
}
j++;
}
//最后交换pivot和第i-1个
swap(array,low,i-1);
//递归调用左边右边
subSort(array,low,i-2);
subSort(array,i,high);
}
}
public static void swap(int[] array,int low,int high){
int temp=array[low];
array[low]=array[high];
array[high]=temp;
}
、单向链表快速排序
public void quickSort(){
Node curNode=head;
while(curNode.next!=null){
curNode=curNode.next;
subSort(head,curNode);
}
public void subSort(Node low,Node high){
if(low==null||low.next==null||low==high) return;
int pivot=low.val;
Node i=low.next;
Node i_ore=low;
Node j=low.next;
while(i !=high.next){
if(i.val<pivot){
swapNode(i,j);
//track the previous Node of i
i_ore=i;
i=i.next();
}
i=i.next();
}
swapNode(low,i_ore);
printList();
subSort(low,i_ore);
subSort(i,high);
}
public void swapNode(Node a,Node b){
int temp=a.val;
a.val=b.val;
b.val=temp;
}
}