#include <stdio.h>
#include <stdlib.h>
int i = 0;
void swap(int *a,int *b);
int getpivot(int *list,int L,int R);
int* quicksort(int *list,int L,int R,int size);
void swap(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
/*獲取中間值pivot*/
int getpivot(int *list,int L,int R)
{
int mid = (L+R) / 2;
if(list[L] > list[mid])swap(&list[L],&list[mid]);
if(list[L] > list[R])swap(&list[L],&list[R]);
if(list[mid] > list[R])swap(&list[mid],&list[R]);
swap(&list[mid],&list[R]);
return list[R];
}
/*快速排序*/
int* quicksort(int *list,int L,int R,int size)
{
int low,high,pivot,j;
if(L < R)
{
pivot = getpivot(list,L,R);
low = L-1,high = R;//目標排序序列是 0 - size-2
while (1)
{
while (list[++low] < pivot);
while (list[--high] > pivot);//尋找左邊大於pivot的右面小於pivot的
if(low < high)swap(&list[low],&list[high]);//在正常範圍內 把左大右小交換
else break;
}
swap(&list[low],&list[R]);//將pivot放到正確的位置
printf("第%d趟結果:",++i);
for(j = 0;j < size;j++)
printf("%d%c",list[j]," \n"[j == size-1]);
quicksort(list,L,low-1,size);//將pivot前面的排序
quicksort(list,low+1,R,size);//。。。後面排序
}
return list;
}
int main(int argc, char const *argv[]) {
int size,*list,i;
printf("請輸入數組大小:");
scanf("%d",&size);
list = (int*)malloc(sizeof(int)*(size+1));
printf("請輸入%d個元素:\n",size);
for(i = 0;i < size;i++)
scanf("%d",&list[i]);
list = quicksort(list,0,size-1,size);
return 0;
}
王道考研 ++++ 快速排序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.