今天花一上午时间写的快速排序算法,自己娱乐了

#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");
}


代码写的比较纠结,因为一个相等和赋值搞混了,结果调试了半天的代码,哎,自己的功力有待遇提高呀,一个小教训。




= 与 == 的区别



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值