排序

一、插入排序

1、直接插入排序

2、希尔排序

二、选择排序

1、简单选择排序

2、堆排序

三、交换排序

1、冒泡排序(Bubble Sort)

      对一个有n个数的序列,进行(n-1)次扫描,每次扫描都比较相邻的两个元素大小,若顺序错误,则将两个元素交换,这样每次扫描都会得到正确排序的最后一位元素。

比如:3 2 1

第一次扫描:3 2 1-->2 3 1      2 3 1-->2 1 3

第二次扫描:2 1 3-->1 2 3

void bubblesort(int a[],int n)
{
    for(int j=0;j<n-1;j++)//进行(n-1)次扫描
        for(int i=0;i<n-1-j;i++)//对序列扫描
        {
            if(a[i]>a[i+1])//若错误排序,则交换
            {
                int temp=a[i];
                a[i]=a[i+1];
                a[i+1]=temp;
            }
    }
}

2、快速排序

    快排是对冒泡排序的一种改进,它的思想是选取一个关键数据(key),经过一趟排序,把要排序的数据分成独立的两部分,一部分全部小于或等于关键数据,一部分大于等于关键数据,然后按此方法对这两部分进行快排,整个过程用递归实现,以此达到整个数据有序。关键数据(key)可以在数据中仍选一个,但一般选第一个数据。

    快速排序可以分为以下几步:

    1) 设置两个变量first、last分别指向需要快排的首部(low)和尾部(high);

    2)以第一个数据为关键数据,key=a[first];

    3)从后面开始搜素(last--),找到第一个小于key的数据,并且将它赋值给a[first],即a[first]=a[last];

    4) 从前面开始搜素(first++),找到第一个大于key的数据,并且将它赋值给a[last],即a[last]=a[first];

    5) 重复3、4步,直到前面的数据都小于key,后面的数据都大于key,即first=last;然后把关键数据放到序列中,既a[first]=key;

    6)分别将关键数据的前部分和后部分进行1~5步,又可以将前部分和后部分别分为两部分,然后继续进行1~5步操作,以此继续下去,直到序列排好序,这样就可以用到递归实现了。

    例如原序列:3 8 2 4 5 7 1 6

    key=3, 3 8 2 4 5 7 1  首先将3作为关键数据,用first、last分别指向序列的首部和尾部,把小于3和大于3的元素分开,首先比较3和6,6>3,last左移;

    key=3, 3 8 2 4 5 7 1 6  比较3和1,1<3,把1放到左边,即a[first]=a[last];然后从左边开始;

    key=3, 1 8 2 4 5 7 1 6  比较8和3,8>3,把8移到右边,即a[last]=a[first],又从右边开始比较;

    key=3, 1 8 2 4 5 7 8 6  7、5、4>3,直到last移到2(2<3)的位置,再从左边开始,以此下去,直到first=last;

    key=3, 1 2 2 4 5 7 8 6  把key放到序列中,即a[firsrt]=key;变成如下序列;

            1 2 3 4 5 7 8 6

   之后把2的左边和右边分别进行快排,需要进行递归调用,最终生成最后的结果。

代码如下:

void quicksort(int a[],int low,int high)//进行快排的数组,以及需进行快排的首尾地址
{
    if(low>=high)//递归结束条件
        return ;
    int first=low;
    int last=high;
    int key=a[first];
    while(first<last)//快排过程
    {
        while(first<last && a[last]>=key)
            last--;
        a[first]=a[last];
        while(first<last && a[first]<=key)
            first++;
        a[last]=a[first];
    }
    a[first]=key;//将关键数据放到原序列中
    quicksort(a,low,first-1);//左边快排,递归进行
    quicksort(a,first+1,high);//右边快排,递归进行
}

四、归并排序

五、基数排序

原文地址:https://www.cnblogs.com/mgxj/p/4163119.html