#include<stdio.h>
void printA(int a[],int len){
int i;
for(i=1;i<=len;i++)
printf("%d ",a[i]);
printf("\n");
}
//版本1
void quickSort(int a[],int left, int right)
{
if(left<right){
int temp = a[left];
int l = left;
int r = right;
while(l!=r){
while(r>l&&a[r]>temp)
r--;
a[l] = a[r];
while(l<r && a[l]<temp)
l++;
a[r] = a[l];
}
a[l] = temp;
if(left<l-1)
quickSort(a,left,l-1);
if(l+1<right)
quickSort(a,l+1,right);
}
}
//版本2
void quickSortNew(int *a, int left, int right){
int i = left;
int j = right;
if(left<right){
a[0] = a[left];
while(i!=j){
while(j>i && a[j]>a[0])
j--;
if(i<j){
a[i] = a[j];
i++;
}
while(i<j && a[i]<a[0])
i++;
if(i<j){
a[j] = a[i];
j--;
}
}
a[i] = a[0];
quickSortNew(a,left,i-1);
quickSortNew(a,i+1, right);
}
}
//版本3
int lomuto_partition(int a[], int left, int right){
int i = left-1;
int j;
int temp;
for(j=left; j<right; j++){
if(a[j]<a[right]){
i++;
temp = a[i];
a[i] = a[j];
a[j] = a[i];
}
}
temp = a[right];
a[right] = a[++i];
a[i] = temp;
return i;
}
void lomuto_sort(int a[], int left, int right){
if(left<right){
int q = lomuto_partition(a, left, right);
lomuto_sort(a,left,q-1);
lomuto_sort(a, q+1,right);
}
}
int main(){
int a[] = {8,2,8,7,1,3,5,6,4};
printA(a,8);
printf("********\n");
quickSort(a,1,8);
printA(a,8);
printf("*********\n");
quickSortNew(a,1,8);
printA(a,8);
printf("********lomuto_sort****\n");
lomuto_sort(a,1,8);
printA(a,8);
return 0;
}
然后研究了一个荷兰旗问题:
代码如下
#include<stdio.h>
void swap(int *a, int *b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void sort(int a[],int left, int right){
int begin = left;
int current = left;
int end = right;
while(current<=end){
if(a[current] == 0){
swap(&a[begin],&a[current]);
current++;
begin++;
}else if(a[current] == 1){
current++;
}else if(a[current] == 2){
swap(&a[current],&a[end]);
end--;
}
}
}
int main(){
int a[] = {10,0,1,2,1,1,2,0,2,1,0};
int i;
for(i=1;i<=10;i++)
printf("%d ",a[i]);
printf("\n");
sort(a,1,10);
for(i=1;i<=10;i++)
printf("%d ",a[i]);
printf("\n");
}
= 与 == 的区别