您的位置:首页 > 编程语言 > C语言/C++

各种排序算法C++实现

2016-10-21 12:07 246 查看
//各种排序算法的实现

/*

交换函数

*/

void swap(int
*list,
int low,
int high
)

{    

    int temp
= list[low];

    list[low]
= list[high];

    list[high]
= temp;

}

/*

小于函数

*/

bool lt(const
int low,
const int high
)

{

    if(low
< high)

        return true;

    else

        return false;

}

/*

插入排序(稳定)

原理:插入排序逐个处理待排序的记录。每个新记录与前面已排序的子序列进行比较,

将它插入到子序列中正确的位置

代价是n2

*/

void inssort(
int *list,
int n )

{

    int i,j;

    for( i
= 1; i
< n; i++
)

    {

        for( j
= i;
( j > 0
) &&
( lt( list[j], list[j-1]
) ); j--
)

            swap( list, j, j-1
);

    }

}

/*

冒泡排序(稳定)

原理:第一次的内部for循环从记录数组的底部比较到顶部,比较相邻的值。

如果低序号的值比高序号的值大,则二者交换顺序

代价是n2

*/

void bubsort(
int *list,
int n )

{

    int i,j;

    for
( i = 0; i
< n-1; i++
)

    {

        for
( j = n-1; j
> i; j--
)

        {    

            if( lt( list[j],
list[j-1]
) )

                swap( list, j, j-1
);

        }

    }

}

/*

选择排序(不稳定)

原理:选择排序的第i次是“选择”数组中第i小的记录,并将该记录放到数组的第i个位置。

即首先从未排序的序列中找到最小的值,接着找到次小的,依次类推

代价是n2

*/

void selsort(
int *list,
int n )

{

    int i,j;

    for
( i = 0; i
< n-1; i++
)

    {

        int low_index
= i;

        for
( j = n-1; j
> i; j--
)

        {    

            if( lt( list[j],
list[low_index]
) )

                low_index = j;

        }

        swap( list, i, low_index
);

    }

}

/*

插入排序函数(shell排序的辅助函数)

*/

void inssort(
int *list,
int n,
int incr
)

{

    int i,j;

    for
( i = incr; i
< n; i
+= incr
)

    {

        for
( j = i;
(j >= incr)
&&
(lt (list[j],list[j-incr])
); j
-= incr
)

        {    

            swap( list, j, j-incr
);

        }        

    }

}

/*

shell排序(不稳定)

原理:将序列分成子序列,然后分别对子序列用插入排序的方法进行排序,最后将子序列组合起来。

代价是n1.5

*/

void shellsort(
int *list,
int n )

{

    int i,j;

    for
( i = n/2; i
> 2; i
/= 2
)

    {

        for
( j = 0; j
< i; j++
)

        {    

            inssort(&list[j], n-j,
i);

        }

    }

    inssort(list, n, 1);

}

/*

快速排序(不稳定)

原理:首先选择一个轴值,小于轴值的结点被放到轴值的左边,大于轴值的结点被放到轴值的右边,这样轴值就被放在了正确的位置上。

然后对轴值左边和右边的子序列进行类似操作。

第一次调用的形式为quicksort(list,0,n-1)

代价是n*logn

*/

void quicksort(int
*list,
int low,
int high)

{

    int pivot
= list[
(low + high)
/ 2 ];

    int
left = low
- 1;

    int
right = high;

    

    if(low
>= high)

        return 0;

    

    swap(list,
(low + high)
/ 2, high);          

    do     

    {

        while(list[++left]
< pivot);         

        while(right
!= 0
&& list[--right]
> pivot);         

        swap(list,
left,
right);     

    }
while (left
< right);          

    

    swap(list,
left,
right);     

    swap(list,
left, high);          

    

    quicksort(list, low,
left - 1);     

    quicksort(list,
left + 1, high);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: