【排序演算法6】快速排序
阿新 • • 發佈:2018-12-02
快速排序是一種分治的策略。
快速排序的中心思想:
1.尋找一箇中心元素(通常為第一個數)
2.將小於中心點的元素移動至中心點之前,將大於中心點的元素移動至中心點之後
3.對上步分成的2個無序陣列段重複1 2 操作直至斷長為1為止
簡單來說:挖坑填數 + 分治法
#include <stdio.h> #include <Windows.h> #include "MyFunctions.h" int divide(int a[],int start,int end) { int i = start,j = end,temp; temp = a[i]; while( i < j ) { while(i < j && temp < a[j]) { --j; } if( i < j) { a[i] = a[j]; //把a[i]的坑用a[j]填上,現在a[j]是一個坑 ++i; } while(i < j && temp >= a[i]) { ++i; } if( i < j ) { a[j] = a[i]; //把a[j]的坑用a[i]填上,現在a[j]是一個坑 --j; } } a[i] = temp; //最後a[i]的坑用temp填上 printf("起始位置%d 中間位置%d 末尾位置%d ",start,i,end); PJDprint(a,10); return i; } void quick_sort(int a[],int start,int end) { if(start < end) { int mid = divide(a,start,end); quick_sort(a,start,mid-1); quick_sort(a,mid+1,end); } } int main() { int a[10] = {72,6,57,88,60,42,83,73,48,85}; PJDprint(a,10); quick_sort(a,0,9); system("pause"); return 0; }
其中divide函式也可以直接交換2個數據。
int divide(int* a,int start,int end) { int i = start,j = end,temp; temp = a[i]; for(;i < j;) { //一開始是從後面往前面-- while( a[j] >= temp && i != j ) { --j; } PJDSwap( &a[i],&a[j] ); //發生一次交換之後,從前面往後面++ while( a[i] < temp && i != j ) { ++i; } PJDSwap(&a[i],&a[j]); } return i; //返回中心元素的下標 }
感謝MoreWindows快速排序提供的思路挖坑填數非常形象