C语言:快速排序(递归)和插入排序(循环)

#include
void quickSort(int arr[],size_t left,size_t right){
        int key = arr[left];
        int i = left,j = right;
        if(left >= right){
                return;
        }
        while(i < j){
                while(i<j&&arr[j] >= key){j--;}
                arr[i] = arr[j];
                while(i<j&&arr[i] <= key){i++;}
                arr[j] = arr[i];
        }
        arr[i] = key;
        if(i-left>1){
                quickSort(arr,left,i - 1);
        }
        if(i+1 <right){
                quickSort(arr,i + 1,right);
        }
}
void insertSort(int arr[],size_t len){
        int i,j,n;
        for(i = 1;i<len;i++){
                for(j = i;j>0;j--){
                        if(arr[j]<arr[j-1]){
                                n = arr[j];
                                arr[j] = arr[j-1];
                                arr[j-1] = n;
                        }else{
                                break;
                        }
                }
        }
}
int main(){
        int arr[8] = {8,7,6,5,4,3,2,1};
        insertSort(arr,8);
        int i;
        for(i = 0;i<8;i++){

                printf("%d ",arr[i]);
        }
}

快速排序思路:
4 3 5 2 1,函数输入参数数组和left,right代表数组区间。
用key记录从左开始第一位数,然后从right开始查找一个小于key:4的数:1,记录下标j。将arr[j]赋值给arr[i] ,此时数组:1 3 5 2 1;
然后从左开始查找一个比key大的数arr[i],赋值给arr[j],此时数组:1 3 5 2 5;
重复上面两人过程直到(i>=j)将会得到数组:1 3 2 2 5;
此时i=j =3,把key复制给arr[i]得最后的数组:1 3 2 4 5;
可以发现在key左边的数都比key小,在key右边的数都比key大。
如此将左右两区间继续递归可得最后正序数组。
插入排序思路:
5 4 3 2 1,函数输入参数数组arr[]和数组长度len。
从左往右看,单只有一个5时,可以看作是正序数组:5,所以从下标1开始循环,4 < 5,4 和5 交换位置,结束一次循环;如此对后续每一个数进行判断;
由于每个数开始判断之前,前面的数组已经排序完成,当第一个不符合排序条件出现时,结束循环;
最后一个数结束循环时,完成排序。

你可能感兴趣的:(C语言,快速排序,c语言)