无涯教程-快速排序

19 阅读2分钟

快速排序是一种高效的排序算法,它基于将数据数组划分为较小的数组。将一个大数组分为两个数组,其中一个数组的值小于指定值(如 pivot),基于该数组进行分区,另一个数组的值大于该pivot值。

快速排序对数组进行分区,然后递归调用两次以对两个输出子数组进行排序,该算法对于大型数据集非常有效,因为其平均和最坏情况下的复杂度为Ο(n 2 ),其中 n 是项数。

快速排序分区

下面的动画表示法说明了如何在数组中查找pivot值。

Quick Sort Partition Animation

pivot值将列表分为两部分。递归地我们找到每个子列表的pivot,直到所有列表仅包含一个元素。

快速排序Pivot伪代码

上面算法的伪代码可以推导为-

function partitionFunc(left, right, pivot)
   leftPointer = left
   rightPointer = right - 1

while True do while A[++leftPointer] < pivot do //do-nothing end while

  </span><span class="kwd">while</span><span class="pln"> rightPointer </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> A</span><span class="pun">[--</span><span class="pln">rightPointer</span><span class="pun">]</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> pivot </span><span class="kwd">do</span><span class="pln">
     </span><span class="com">//do-nothing         </span><span class="pln">
  </span><span class="kwd">end</span><span class="pln"> </span><span class="kwd">while</span><span class="pln">
	
  </span><span class="kwd">if</span><span class="pln"> leftPointer </span><span class="pun">&gt;=</span><span class="pln"> rightPointer
     </span><span class="kwd">break</span><span class="pln">
  </span><span class="kwd">else</span><span class="pln">                
     swap leftPointer</span><span class="pun">,</span><span class="pln">rightPointer
  </span><span class="kwd">end</span><span class="pln"> </span><span class="kwd">if</span><span class="pln">
	

end while

swap leftPointer,right return leftPointer

end function

快速排序伪代码

要了解更多信息,请参阅快速排序算法的伪代码-

procedure quickSort(left, right)

if right-left <= 0 return else
pivot
= A[right] partition = partitionFunc(left, right, pivot) quickSort(left,partition-1) quickSort(partition+1,right)
end if

end procedure

C进行快速排序实现

#include <stdio.h>
#include <stdbool.h>

#define MAX 7

int intArray[MAX] = {4,6,3,2,1,9,7};

void printline(int count) { int i;

for(i = 0;i < count-1;i++) { printf("="); }

printf("=\n"); }

void display() { int i; printf("[");

// navigate through all items for(i = 0;i < MAX;i++) { printf("%d ",intArray[i]); }

printf("]\n"); }

void swap(int num1, int num2) { int temp = intArray[num1]; intArray[num1] = intArray[num2]; intArray[num2] = temp; }

int partition(int left, int right, int pivot) { int leftPointer = left -1; int rightPointer = right;

while(true) { while(intArray[++leftPointer] < pivot) { //do nothing }

  </span><span class="kwd">while</span><span class="pun">(</span><span class="pln">rightPointer </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> intArray</span><span class="pun">[--</span><span class="pln">rightPointer</span><span class="pun">]</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> pivot</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     </span><span class="com">//do nothing</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">leftPointer </span><span class="pun">&gt;=</span><span class="pln"> rightPointer</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     printf</span><span class="pun">(</span><span class="str">" item swapped :%d,%d\n"</span><span class="pun">,</span><span class="pln"> intArray</span><span class="pun">[</span><span class="pln">leftPointer</span><span class="pun">],</span><span class="pln">intArray</span><span class="pun">[</span><span class="pln">rightPointer</span><span class="pun">]);</span><span class="pln">
     swap</span><span class="pun">(</span><span class="pln">leftPointer</span><span class="pun">,</span><span class="pln">rightPointer</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

}

printf(" pivot swapped :%d,%d\n", intArray[leftPointer],intArray[right]); swap(leftPointer,right); printf("Updated Array: "); display(); return leftPointer; }

void quickSort(int left, int right) { if(right-left <= 0) { return;
} else { int pivot = intArray[right]; int partitionPoint = partition(left, right, pivot); quickSort(left,partitionPoint-1); quickSort(partitionPoint+1,right); }
}

int main() { printf("Input Array: "); display(); printline(50); quickSort(0,MAX-1); printf("Output Array: "); display(); printline(50); }

Input Array: [4 6 3 2 1 9 7 ]
==================================================
 pivot swapped :9,7
Updated Array: [4 6 3 2 1 7 9 ]
 pivot swapped :4,1
Updated Array: [1 6 3 2 4 7 9 ]
 item swapped :6,2
 pivot swapped :6,4
Updated Array: [1 2 3 4 6 7 9 ]
 pivot swapped :3,3
Updated Array: [1 2 3 4 6 7 9 ]
Output Array: [1 2 3 4 6 7 9 ]
==================================================

参考链接

www.learnfk.com/data-struct…