用js写了个快排,还有优化的余地 又用同样逻辑了个c语言版的

看了一天别人的代码,换换思路,写个快排。

直接上代码,低估了,原理一直记得,本以为10分钟能搞定,但出现很多小bug,整了20多分钟。

/**

 * Created by cdpmac on 15/5/15.

 */



var arr = [5, 3, 7, 4, 1, 9, 8, 6, 2];

quickSort(arr,0,arr.length-1);





console.log(arr);

function quickSort(arr,left,right){

    if( left>=right){

        return;

    }

    var index=left;  //基础标识位 第一次为0

    var hight=right;

    //退出条件,左指针和右指针重合

    for(;left<right;){

        //从右向左找

        for(var i=right;i>left;i--){

//        如果找到,则交换两项的值。

            if(arr[i]<arr[index]){

                swap(arr,index,i);

                //交换之后

                //第一次 右-》左 为 [2, 3, 7, 4, 1, 9, 8, 6, 5] index 设i为(8);

                index=i;

                break;

            }

            right--;

        }

        for(var i=left+1;i<right;i++){

            if(arr[i]>arr[index]){

                swap(arr,index,i);

                //交换之后

                //第一次 左-》右 为 [2, 3, 5, 4, 1, 9, 8, 6, 7] index 设i为(2) ;

                index=i;

                break;

            }

            left++;

        }

    }

    //第一遍完事后,原来的基准值,也就是key(0)-value(5)到了index的位置。

    //该例结果是 [ 2, 3, 1, 4, 5, 9, 8, 6, 7 ],index为5

    //再以这个index为分割点,分别对左侧和右侧 递归执行该方法

    //原index已经在正中间,不用再比较index所处位置的值,两侧分别以-1为上限 +1为下限。

    quickSort(arr,0,index-1);//这么写 当index为0时 出无限递归了

//    left:0->right:0   [ 1, 2, 3, 4, 5, 9, 8, 6, 7 ]

//    left:0->right:-1  [ 1, 2, 3, 4, 5, 9, 8, 6, 7 ]

    quickSort(arr,index+1,hight);//也有可能出递归

//    在最上方加判断 left<right  修正





}

function swap(arr,lIndex,rIndex){

    var temp = arr[lIndex];

    arr[lIndex] = arr[rIndex];

    arr[rIndex] = temp;

}

 

c

#include <stdlib.h>

#include <stdio.h>

#include <string.h>



void swap(int *x,int *y);

void quickSort(int arr[],int left,int right);







int main(void) {

    int luan[9]={5, 3, 7, 4, 1, 9, 8, 6, 2};

    quickSort(luan,0,8);



    for(int i=0; i<8; i++)

{

  if(i>0)

    printf(",");

  printf("%d",luan[i]);

}

}



// void swap(int arr[],int x,int y){

//     int temp=arr[x];

//     arr[x]=arr[y];

//     arr[y]=temp;

// }



void swap(int *x,int *y){

    int temp=*x;

    *x=*y;

    *y=temp;

}

void quickSort(int arr[],int left,int right){

if(left<right){

    int index=left;

    int hight=right;

    for(;left<right;){

          for(int i=right;i>left;i--){

        if(arr[i]<arr[index]){

                               swap(&(arr[index]),&(arr[i]));

                //交换之后

                //第一次 右-》左 为 [2, 3, 7, 4, 1, 9, 8, 6, 5] index 设i为(8);

                index=i;

                break;

            }

            right--;

        }

    

    for(int i=left+1;i<right;i++){

            if(arr[i]>arr[index]){

                // swap(arr,index,i);

                swap(&(arr[index]),&(arr[i]));

                //交换之后

                //第一次 左-》右 为 [2, 3, 5, 4, 1, 9, 8, 6, 7] index 设i为(2) ;

                index=i;

                break;

            }

            left++;

        }

    }

         quickSort(arr,0,index-1);//这么写 当index为0时 出无限递归了

    quickSort(arr,index+1,hight);//也有可能出递归

}



}

 

你可能感兴趣的:(C语言)