各种常见排序实现代码

主要包括冒泡、简单选择、插入、堆排、归并、快排这几种。以后会慢慢补充。

可能有错,欢迎指出。

#include<iostream>
#include<cstdio>
using namespace std;
//升序
int arr[10000],length;

//冒泡排序
void Bubble_Sort(int *Arr,int length)
{
    bool update;
    while(1)
    {
        update=false;
        for(int i=0; i<length-1; ++i)
            if(Arr[i]>Arr[i+1])
            {
                int temp=Arr[i];
                Arr[i]=Arr[i+1];
                Arr[i+1]=temp;
                update=true;
            }
        if(!update) break;
    }
}

//简单选择排序
void SimpleEelect_Sort(int *Arr,int length)
{
    for(int i=0; i<length; ++i)
    {
        int minn=i;
        for(int j=i+1; j<length; ++j)
            if(Arr[j]<Arr[minn])
                minn=j;
        if(minn!=i)
        {
            int temp=Arr[i];
            Arr[i]=Arr[minn];
            Arr[minn]=temp;
        }
    }
}

//直接插入排序
void Insert_Sort(int *Arr,int length)
{
    for(int i=1; i<length; ++i)
    {
        int key=Arr[i];
        int j;
        for(j=i-1; j>=0; --j)
        {
            if(Arr[j]<=key)  break;
            else Arr[j+1]=Arr[j];
        }
        Arr[j+1]=key;
    }
}

//堆排
void HeapAdjust(int *Arr,int rt,int length)
{
    int largest=rt;
    int key=Arr[rt];
    while(1)
    {
        int lc=rt*2+1,rc=rt*2+2;
        if(lc<length&&Arr[lc]>Arr[largest]) largest=lc;
        if(rc<length&&Arr[rc]>Arr[largest]) largest=rc;
        if(largest==rt)  break;
        Arr[rt]=Arr[largest];
        Arr[largest]=key;
        rt=largest;
    }
}
void HeapBuild(int *Arr,int length)
{
    for(int i=(length-1)/2; i>=0; --i)
        HeapAdjust(Arr,i,length);
}
void Heap_Sort(int *Arr,int length)
{
    HeapBuild(Arr,length);
    for(int i=length-1; i>=1; --i)
    {
        int temp=Arr[i];
        Arr[i]=Arr[0];
        Arr[0]=temp;
        HeapAdjust(Arr,0,i);
    }
}

//归并排序
int A[10000];
void Merge_Sort(int *Arr,int L,int R)
{
    if(L<R)
    {
        int M=(L+R)/2;
        Merge_Sort(Arr,L,M);
        Merge_Sort(Arr,M+1,R);
        int p=L,q=M+1,i=L;
        while(p<=M||q<=R)
        {
            if(q>R||(p<=M&&Arr[p]<=Arr[q])) A[i++]=Arr[p++];
            else A[i++]=Arr[q++];
        }
        for(int j=L; j<=R; ++j)
            Arr[j]=A[j];
    }
}

//快速排序
int partition(int *Arr,int L,int R)
{
    int key=Arr[R];
    int i=L-1;
    for(int j=L; j<=R; ++j)
        if(Arr[j]<=key)
        {
            i++;
            int temp=Arr[j];
            Arr[j]=Arr[i];
            Arr[i]=temp;
        }
    return i;
}
void Quick_Sort(int *Arr,int L,int R)
{
    if(L<R)
    {
        int mid=partition(Arr,L,R);
        Quick_Sort(Arr,L,mid-1);
        Quick_Sort(Arr,mid+1,R);
    }

}

void read()
{
    scanf("%d",&length);
    for(int i=0; i<length; ++i)
        scanf("%d",&arr[i]);
}
void output()
{
    for(int i=0; i<length; ++i)
        printf("%d ",arr[i]);
    printf("\n");
}

int main()
{
    read();
    Quick_Sort(arr,0,length-1);
    output();
    return 0;
}

各种常见排序实现代码

时间: 2024-10-08 02:50:09

各种常见排序实现代码的相关文章

常见排序算法代码总结(Java版)

学习自菜鸟教程,自己加以总结希望可以多多重复!!! 冒泡排序 选择排序 插入排序 希尔排序 快速排序 归并排序 堆排序 基数排序 1 //冒泡排序 O(n2) 2 public static void BubbleSort(int[] arr){ 3 int temp; 4 for(int i=0;i<arr.length-1;i++){ 5 for(int j=0;j<arr.length-1-i;j++){ 6 if(arr[j]>arr[j+1]){ 7 temp = arr[j]

常见排序&amp;查询算法Java代码实现

1. 排序算法代码实现 /** * ascending sort * 外层循环边界条件:总共需要冒泡的轮数--每一轮都将最大或最小的数冒泡到最后 * 内层循环边界条件:冒泡数字移动的边界--最终数字需冒泡到此处 * 时间复杂度:O(n^2) * @param arr */ public static void bubbleSort(int[] arr) { if (arr == null) { throw new RuntimeException("Input arr is null!"

常见排序算法(一) MergeSort

算法思想灰常重要,常见的用到分治思想的算法包括快速排序,归并,二分搜搜,大整数乘法等(参考 http://blog.csdn.net/com_stu_zhang/article/details/7233761,归纳很到位) 简单用归并对一个数组排序 思路: 简单来说对一个数组,只要他的左右两部分都是有序的,那么简单合并就ok了,那么左右两部分可以进一步划分各自的左右两部分----明显就是要递归了 算法:归并排序 1. 将数组一分为二,subArray1 和subArray2 2. 归并排序sub

常见排序算法(java实现)

常见排序算法介绍 冒泡排序 代码: public class BubbleSort { public static void sort(int[] array) { int tValue; for (int i = 0; i < array.length; i++) { for (int j = i; j < array.length; j++) { if (array[i] > array[j]) { tValue = array[i]; array[i] = array[j]; ar

常见排序算法总结

部分转自 http://blog.csdn.net/whuslei/article/details/6442755 排序算法经过了很长时间的演变,产生了很多种不同的方法.对于初学者来说,对它们进行整理便于理解记忆显得很重要.每种算法都有它特定的使用场合,很难通用.因此,我们很有必要对所有常见的排序算法进行归纳. 我不喜欢死记硬背,我更偏向于弄清来龙去脉,理解性地记忆.比如下面这张图,我们将围绕这张图来思考几个问题. 上面的这张图来自一个PPT.它概括了数据结构中的所有常见的排序算法.现在有以下几

几种常见排序算法

几种常见排序算法 几种常见排序算法 写在前面 基础介绍 初级排序算法 selection sort选择排序 insertion sort插入排序 ShellSort希尔排序 shuffing不是排序算法 merge sort归并排序 Abstract in-place merge原地归并的抽象方法 Top-down mergesort自顶向下的归并排序 Bottom-up mergesort自底向上的归并排序 quicksort 三向切分的快速排序 Heapsort堆排序 总结和比较 命题 本文

常见排序算法总结(java实现)

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.常见的排序算法有选择排序,插入排序,希尔排序,归并排序和快速排序 由于在排序的过程中不可避免的要涉及到比较和交换,所以将他们抽取为两个单独的函数,如下所示 //为了排序代码的通用性,这里假定待排序的元素实现了Comparable接口 private static boolean less(Comparable v ,Comparable w){ return v.compareTo(w)<0; } priva

十种常见排序算法

1.常见算法分类 十种常见排序算法一般分为以下几种: (1)非线性时间比较类排序:交换类排序(快速排序和冒泡排序).插入类排序(简单插入排序和希尔排序).选择类排序(简单选择排序和堆排序).归并排序(二路归并排序和多路归并排序): (2)线性时间非比较类排序:计数排序.基数排序和桶排序. 总结: (1)在比较类排序中,归并排序号称最快,其次是快速排序和堆排序,两者不相伯仲,但是有一点需要注意,数据初始排序状态对堆排序不会产生太大的影响,而快速排序却恰恰相反. (2)线性时间非比较类排序一般要优于

MySQL最常见错误代码及代码说明你都知道吗?

MySQL常见错误代码及代码说明一览表: 1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败<=================可以忽略 1008:数据库不存在,删除数据库失败<=================可以忽略 1009:不能删除数据库文件导致删除数据库失败 1010:不能删除数据目录导致删除数据库失败 1011:删除数据库文件失败 1012:不能读取系统表中的记录 1020:记录已被其他用户修改 1021:硬盘剩余空间不足,请加大硬盘可用空间 1