Theo mình biết thì tư tưởng của quicksort là:
- Tìm chốt
- Chuyển tất cả giá trị < chốt về bên trái
- Chuyển tất cả giá trị > chốt về bên phải
- quicksort mảng con trái
- quicksort mảng con phải
Theo code quicksort dưới (đúng) thì sau mỗi lần đệ quy lại đệ quy (left,j) (i,right), như vậy đã không tuân theo tư tưởng của quicksort. Tức là nếu đúng là phải đệ quy (left, m-1) (m+1, right), mình cứ thắc mắc mãi cái này.
#include <iostream>
using namespace std;
void print(int *a, int n)
{
int i=0;
while(i<n){
cout<<a[i]<<",";
i++;
}
}
void swap(int i,int j, int *a){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
void quicksort(int *arr, int left, int right){
int min = (left+right)/2;
cout<<"QS:"<<left<<","<<right<<"\n";
int i = left;
int j = right;
int pivot = arr[min];
while(left<j || i<right)
{
while(arr[i]<pivot)
i++;
while(arr[j]>pivot)
j--;
if(i<=j){
swap(i,j,arr);
i++;
j--;
}
else{
if(left<j)
quicksort(arr, left, j);
if(i<right)
quicksort(arr,i,right);
return;
}
}
}
int main() {
int arr[8] = {110, 5, 10,3 ,22, 100, 1, 23};
quicksort(arr, 0, (sizeof(arr)/sizeof(arr[0]))-1);
print(arr, (sizeof(arr)/sizeof(arr[0])));
return 0;
}