2011-04-08 113 views
3

如何將此快速排序算法轉換爲3,5,7,9和11元素的分區?實現3元素分區的快速排序算法,

#include"stdafx.h" 
#include<iostream> 
using namespace std; 
#include <stdio.h> 
#include <stdlib.h> 
#define size 50 
void swap(int *x,int *y) 
{ 
int temp; 
temp = *x; 
*x = *y; 
*y = temp; 
} 

int partition(int i,int j) 
{ 
return((i+j) /2); 
} 

void quicksort(int list[],int m,int n) 
{ 
int key,i,j,k; 
if(m < n) 
{ 
k = partition(m,n); 
swap(&list[m],&list[k]); 
key = list[m]; 
i = m+1; 
j = n; 
while(i <= j) 
{ 
while((i <= n) && (list[i] <= key)) 
i++; 
while((j >= m) && (list[j] > key)) 
j--; 
if(i < j) 
swap(&list[i],&list[j]); 
} 

swap(&list[m],&list[j]); 
quicksort(list,m,j-1); 
quicksort(list,j+1,n); 
} 
} 
void printlist(int list[],int n) 
{ 
int i; 
for(i=0;i<n;i++) 
printf("%d\t",list[i]); 
} 

void main() 
{ 
int n,i; 
int list[size]; 


printf("How many numbers do you want to enter"); 
scanf("%d",&n); 
printf("Enter the numbers you want to sort"); 
for(i=0;i<n;i++) 
{ 
scanf("%d",&list[i]); 
} 


printf("The list before sorting is:\n"); 
printlist(list,n); 
quicksort(list,0,n-1); 
printf("The list after sorting using quicksort algorithm:\n"); 
printlist(list,n); 
system("pause"); 
} 
+4

請不要大叫。 – 2011-04-08 14:19:13

+0

快速排序中的分區階段包括將要排序的序列元素重新排列到所選透視的左側或右側,具體取決於它們分別小於或大於透視。不過,不清楚「_x_分區」是什麼意思。 – abeln 2011-04-08 14:59:50

+0

如果您在gregg的答案(和閱讀)後仍有問題,請將它們添加到問題中(如果它們是相關的),或者創建一個新問題。 – 2011-04-08 15:00:57

回答

5

我認爲你的C++老師只是有一個糟糕的措辭選擇。 「3個元素的分區」幾乎肯定意味着:通過選擇第一個,中間和最後一個元素的中間值來選擇主元素 - 這是最常用的編碼技術,並且在數組已經排序後具有良好的屬性。

推斷該定義爲5,7,9,11.

+1

我認爲它不是可憐的措辭選擇,但非常棘手。 – james 2011-04-08 18:02:14

+1

或者它可能是一匹馬而不是斑馬:http://www.google.com/search?client=safari&rls=zh-CN&q=partition+of+3+medians&ie=UTF-8&oe=UTF-8 – 2011-04-08 20:22:55

+0

啊,我有認爲這個想法是分成4/6/8部分而不是兩部分。 – 2011-04-09 01:07:53

0

分區是quicksort算法的重要組成部分。回顧the algorithm瞭解什麼是分區。祝你好運。

+0

沒錯,但是您能否詳細說明「_x_元素的分區」是什麼? – abeln 2011-04-08 15:01:00

+0

是的,我知道什麼時候樞軸得到了正確的位置分區發生。但是我不知道x元素的分區的含義。 – james 2011-04-08 15:17:16