C语言完整实现12种排序算法(小结)

目录
  • 1.冒泡排序
  • 2.插入排序
  • 3.折半插入排序
  • 4.希尔排序
  • 5.选择排序
  • 6.鸡尾酒排序
  • 7.堆排序
  • 8.快速排序
  • 9.归并排序
  • 10.计数排序
  • 11.桶排序
  • 12.基数排序

1.冒泡排序

思路:比较相邻的两个数字,如果前一个数字大,那么就交换两个数字,直到有序。
时间复杂度O(n^2),稳定性:这是一种稳定的算法。
代码实现:

void bubble_sort(int arr[],size_t len){
    size_t i,j;
    for(i=0;i<len;i++){
        bool hasSwap = false;        //优化,判断数组是否已经有序,如果有序可以提前退出循环
        for(j=1;j<len-i;j++){        //这里j<len-i是因为最后面的肯定都是最大的,不需要多进行比较
            if(arr[j-1]>arr[j]){    //如果前一个比后一个大
                swap(&arr[j-1],&arr[j]);    //交换两个数据
                hasSwap = true;
            }
        }
        if(!hasSwap){
            break;
        }
    }
}

2.插入排序

思路:把一个数字插入一个有序的序列中,使之仍然保持有序,如对于需要我们进行排序的数组,我们可以使它的前i个数字有序,然后再插入i+1个数字,插入到合适的位置使之仍然保持有序,直到所有的数字有序。
时间复杂度:O(n^2) 稳定性:稳定的算法
代码实现:

void insert_sort(int arr[],int len){
    int i,j;
    for(i=1;i<len;i++){
        int key = arr[i];            //记录当前需要插入的数据
        for(j= i-1;i>=0&&arr[j]>key;j--){    //找到插入的位置
            arr[j+1] = arr[j];                //把需要插入的元素后面的元素往后移
        }
        arr[j+1] = key;        //插入该元素
    }
}

3.折半插入排序

思路:本质上是插入排序,但是通过半分查找法找到插入的位置,让效率稍微快一点。
时间复杂度:O(n^2),稳定性:稳定的算法。
代码实现:

void half_insert_sort(int arr[],int len){
    int i,j;
    for(i=1;i<len;i++){
        int key = arr[i];
        int left = 0;
        int right = i-1;
        while(left<=right){    //半分查找找到插入的位置
            int mid = (left+right)/2;
            if(key<arr[mid]){
                right = mid-1;
            }else{
                left = mid+1;
            }
        }
        for(j=i-1;j>=left;j--){        //把后面的元素往后移
            arr[j+1]=arr[j];
        }
        arr[j+1] = key;    //插入元素
    }
}

4.希尔排序

思路:先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;然后取d2<d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止。
时间复杂度:O(n^1.3) ,算法效率上大大提高 。稳定性:不稳定的算法。
代码实现:

void shell_sort(int arr[],int len){    //本质上也是一种插入排序,避免了大量数据的移动,在每一组排序过后,每个数据已经到了大致的位置。
    int i,j;
    int step=0;
    for(step = len/2;step>=1;step=step/2){    //分组  分为step组,对每组的元素进行插入排序
        for(i=step;i<len;i++){
            int key = arr[i];
            for(j=i-step;j>=0&&arr[j]>key;j=j-step){
                arr[j+step] = arr[j];
            }
            arr[j+step] = key;
        }
    }
}

5.选择排序

思路:通过循环找到最大值所在的位置,然后把最大值和最后一个元素进行交换,通过循环直到所有的数据有序。
时间复杂度:O(n^2) 稳定性:不稳定的算法
代码实现:

void select_sort(int arr[],size_t len){
    size_t i,j;
    for(i=0;i<len-1;i++){
        int max = 0;        //最大值下标
        for(j=1;j<len-i;j++){
            if(arr[max]<arr[j]){    //找到最大值的下标
                max = j;
            }
        }
        if(max!=j-1){
            swap(&arr[max],&arr[j-1]);    //把最后一个元素和最大值进行交换
        }
    }
}

6.鸡尾酒排序

思路:选择排序的一种改进,一次循环直接找到最大值和最小值的位置,把最大值和最后一个元素进行交换,最小值和最前一个元素进行交换,所以最外层的循环只需要执行len/2次即可
时间复杂度:O(n^2) 稳定性:不稳定的算法
代码实现:

void cocktail_sort(int arr[],size_t len){
    size_t i,j;
    for(i=0;i<len/2;i++){
        int max = i;    //最大值下标
        int min = i;    //最小值下标
        for(j=i+1;j<len-i;j++){
            if(arr[max]<arr[j]){    //找到最大值下标
                max = j;
            }
            if(arr[min]>arr[j]){    //找到最小值下标
                min = j;
            }
        }
        if(max!=j-1){
            swap(&arr[max],&arr[j-1]);        //交换最大值和未进行排序的最后一个元素
        }
        if(min == j-1){    //如果最小值在未进行排序的最后一个位置,那么经过最大值的交换,已经交换到了最大值所在的位置
            min = max;        //把最小值的坐标进行改变
        }
        if(min!=i){
            swap(&arr[i],&arr[min]);    //交换最小值和未进行排序的最前的元素
        }
    }
}

7.堆排序

思路:把数据进行大堆化,然后依次交换堆顶(最大值)和最后一个元素,在使堆顶重新大堆化,最后循环过后数组便有序。
过程:
最大堆调整(Max Heapify):将堆的末端子节点作调整,使得子节点永远小于父节点
创建最大堆(Build Max Heap):将堆中的所有数据重新排序
堆排序(HeapSort):移除位在第一个数据的根节点,并做最大堆调整的递归运算
时间复杂度:O(nlgn) 稳定性:不稳定的算法
实现代码:

void re_heap(int arr[],size_t index,size_t len){
    size_t child = 2*index+1;    //左节点坐标
    int key = arr[index];    //当前节点值
    while(child<len){
        if(child+1<len&&arr[child]<arr[child+1]){    //如果右节点存在且右节点的值比左节点大,那就child记录较大字节点的坐标
            child++;
        }
        if(arr[child]>key){    //如果子节点的值比根节点的值大
            arr[index] = arr[child];    //改变根节点的值
        }else{
            break;
        }
        index = child;
        child = 2*index+1;
    }
    arr[index] = key;        //插入记录好的值
}
void heap_sort(int arr[],size_t len){
    int i;
    for(i=len/2;i>=0;i--){
        re_heap(arr,i,len);        //对第i个根节点进行大堆化
    }
    for(i=len-1;i>0;i--){
        swap(&arr[0],&arr[i]);    //交换第一个和最后一个元素
        re_heap(arr,0,i);    //对第一个元素进行大堆化
    }
}

8.快速排序

思路:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
过程:
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
时间复杂度:O(nlog2n) 稳定性:不稳定的算法
代码实现:

void quick_sort(int arr[],size_t left,size_t right){
    if(left>=right){    //如果只有一个元素,那就是有序的,返回
        return;
    }
    int i = left;
    int j = right;
    int key = arr[left];    //基准值
    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];        //把这个元素放到j的位置
    }
    arr[i] = key;
    if(i-left>1)    //元素个数至少两个才进行递归调用,这样可以少一次递归
        quick_sort(arr,left,i-1);    //对基准值左边的元素进行排序
    if(right-i>1)
        quick_sort(arr,i+1,right);    //对基准值右边的元素进行排序
}

9.归并排序

思路:对于两个有序的子序列,可以把它们合并在一起,变成一个新的完全有序的序列,因此归并排序和快排差不多,都是递归的进行。
时间复杂度:O(nlog2n) 稳定性:稳定的算法
代码实现:

void merge(int arr[],int left,int right){
    int i,j,k;
    int mid = (left+right)/2;
    int len = mid-left+1;
    int *temp = malloc(sizeof(arr[0])*len);
    for(i=0;i<len;i++){
        temp[i] = arr[i+left];    //把这个数组的所有元素都复制到临时数组中
    }
    i=0,j=mid+1,k=left;
    while(i<len&&j<=right){
        if(temp[i]<arr[j]){    //把临时数组的元素和 [mid+1,right]这部分的元素一个一个的进行比较,如果谁小,那么arr里就存放谁的元素
            arr[k++] = temp[i++];
        }else{
            arr[k++] = arr[j++];
        }
    }
    while(i<len){    //如果temp这个数组的元素还没有全部遍历完,那就把temp后面的元素都复制到arr里面去,
    //因为arr[mid+1,right] 这部分的元素本来就是arr后面部分的有序的元素,所以如果arr[mid+1,right]这部分没有遍历完也没关系的,
        arr[k++] = temp[i++];
    }
    free(temp);
}
void merge_sort(int arr[],int left,int right){
    if(left>=right){    //如果只有一个元素说明这个序列有序,那就返回
        return;
    }
    int mid = (left+right)/2;    //对两个有序的数组进行排序,
    merge_sort(arr,left,mid);    //对[left,mid]这个区间的元素进行排序
    merge_sort(arr,mid+1,right);    //对[mid+1,right]这个区间内的元素进行排序
    merge(arr,left,right);  //这个序列的[left,mid]为有序的序列 [mid+1,right]也为有序的序列
}

10.计数排序

思路:这是一种基于比较的算法,我们用一个大数组来存放这些数据,这些数据在这个大数组中的表现形式是以这个大数组的下标存在的,比如57,60,42这三个数字进行排序,那么用一个大数组,这个大数组的arr[57] = 1,arr[60] = 1,arr[42] = 1,然后遍历这个大数组就行了。
时间复杂度:O(n+k),其中这个k为数据的范围,所以计数排序最适合数据比较集中的数组排序。
稳定性:稳定的算法
代码实现:

void count_sort(int arr[],size_t len){
    int max = arr[0];    //最大值
    int min = arr[0];    //最小值
    size_t i;
    for(i=0;i<len;i++){
        if(max<arr[i]){    //找到最大值
            max =arr[i];
        }
        if(min > arr[i]){    //找到最小值
            min = arr[i];
        }
    }
    int cnt = max-min+1;        //范围
    int *prr = malloc(cnt*sizeof(int));    //申请临时空间
    for(i=0;i<cnt;i++){    //这个临时数组全部置0
        prr[i] = 0;
    }
    for(i=0;i<len;i++){    //对需要进行排序的序列进行遍历
        prr[arr[i]-min]++;        //让下标为(arr[i]-min)的临时大数组的值+1
    }
    size_t j=0;
    for(i=0;i<cnt;i++){    //遍历这个临时数组
        while(prr[i]){    //如果这个数组下标为i的值不等于0
            arr[j++] = i+min;    //那就让需要进行排序的数组的值为i+min;
            --prr[i];
        }
    }
    free(prr);        //释放掉申请的动态内存
}

11.桶排序

思路:工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。
这是一种以消耗大量空间来换取高效率的排序方式,
时间复杂度:O(N+C),其中C=N*(logN-logM),M为桶的数量。所以对于桶排序,桶的数量越多,其排序效率越高。
稳定性:稳定的算法
代码实现:
首先定义桶这个类型:

typedef struct Bucket{
    int vect[100];    //其实这里使用链表更好,但是我比较懒,就懒得用链表了
    int cnt;    //当前桶内存放数据的个数
}Bucket;

void bucket_sort(int arr[],size_t len){
    int min = arr[0];
    int max = arr[0];
    size_t i;
    for(i=0;i<len;i++){
        if(min>arr[i]){    //找到最小值
            min = arr[i];    
        }
        if(max<arr[i]){    //找到最大值
            max = arr[i];    
        }
    }
    int size = max-min+1;
    Bucket bucket[5] = {};    //其实桶可以动态规划,但为了方便我这里直接分为5个桶
    for(i=0;i<len;i++){    //遍历待排序的数组,把每个元素放到相应的桶当中,
    //比如[0,200]之间的元素放到下标为0的桶中,[201,400]之间的元素放到下标为1的桶中..
    //以此类推,直到放完所有的数据
        int index = (arr[i]-min)/(size/5);    //用来判断当前元素arr[i]需要放到哪个桶当中
        bucket[index].vect[bucket[index].cnt++] = arr[i];
    }
    size_t j=0,k=0;
    for(i=0;i<5;i++){    //对这五个桶进行遍历
        count_sort(bucket[i].vect,bucket[i].cnt);    //首先对这个桶内的元素进行排序,
        //这里可以调用其他排序方法,也可以递归调用当前排序方法,但是为了节省内存,我选择调用其他排序方法,
        for(j=0;j<bucket[i].cnt;j++){
            arr[k++] = bucket[i].vect[j];    //对排序好的桶进行遍历,并且把里面的元素复制到arr中去    
        }
    }
}

12.基数排序

基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。
解法:
1.首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中;
2.接下来将这些桶子中的数值重新串接起来,接着再进行一次分配,这次是根据十位数来分配;
3.接下来将这些桶子中的数值重新串接起来,持续进行以上的动作直至最高位数为止。
时间复杂度:设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排序的时间复杂度为O(d(n+radix)),其中,一趟分配时间复杂度为O(n),一趟收集时间复杂度为O(radix),共进行d趟分配和收集。
稳定性:稳定的算法;
代码实现:
还是定义桶的类型:

typedef struct Bucket{
    int vect[100];    //同样的可以用链表
    int cnt;
}Bucket;

void base_sort(int arr[],size_t len){
    size_t i;
    Bucket bucket[10] = {};    //十个桶
    int max = arr[0];
    for(i=0;i<len;i++){    //寻找最大值,就可以判断最大值的位数
        if(arr[i]>max){
            max = arr[i];    
        }    
    }
    size_t j,k;
    int num = 1;    //用来获得相应位数上的数字的关键参数,
    //比如要获得个位上的参数时num = 1;
    //获得十位上的数字时num = 10;
    //以此类推
    do{
        for(i=0;i<len;i++){    //遍历待排序的数组,把每个元素放入相应的桶中
        //比如251,当获得个位上的数字时,251放到下标为1的桶当中
        //当获得十位上的数字时,251放到下标为5的桶当中
        //当获得百位上的数字时,251放到下标为2的桶当中
        //当获得千位上的数字时,251放到下标为0的桶当中
        //以此类推
            int index = arr[i]/num%10;    //获得相应位数上的数字
            bucket[index].vect[bucket[index].cnt++] = arr[i];    //把这个数字放到相应的桶中
        }
        k=0;
        for(i=0;i<10;i++){
            for(j=0;j<bucket[i].cnt;j++){
                arr[k++] = bucket[i].vect[j];    //把这些桶按顺序依次遍历,
                //把桶中的元素重新放回arr当中
            }    
            bucket[i].cnt = 0;    //记得让桶中的cnt变为0,方便下一次存放
        }
        num*=10;    //num*10
    }while(max/=10);//循环条件
}

到此这篇关于C语言完整实现12种排序算法(小结)的文章就介绍到这了,更多相关C语言 排序算法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 希尔排序算法的C语言实现示例

    希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位 希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能.这样可以让一个元素可以一次性地朝最终位置前进一大步.然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几

  • C语言排序算法之插入排序

    算法实现: 使用插入排序将下面的数字按照从小到大的顺序排列 步骤1:数组中已经排好的是{1},将9插入数组中 步骤2:数组中已经排好的是{2,9},将5插入数组中 步骤3:数组中已经排好的是{2,5,9},将4插入数组中 步骤4:数组中已经排好的是{2,4,,5,9},将8插入数组中 步骤5:数组中已经排好的是{2,4,,5,8,9},将1插入数组中 步骤6:数组中已经排好的是{1,2,4,,5,8,9},将6插入数组中 步骤7:排序完成 程序代码: #include <stdio.h> #i

  • C语言实现排序算法之归并排序详解

    排序算法中的归并排序(Merge Sort)是利用"归并"技术来进行排序.归并是指将若干个已排序的子文件合并成一个有序的文件. 一.实现原理: 1.算法基本思路 设两个有序的子文件(相当于输入堆)放在同一向量中相邻的位置上:R[low..m],R[m+1..high],先将它们合并到一个局部的暂存向量R1(相当于输出堆)中,待合并完成后将R1复制回R[low..high]中. (1)合并过程 合并过程中,设置i,j和p三个指针,其初值分别指向这三个记录区的起始位置.合并时依次比较R[i

  • C语言选择排序算法及实例代码

    选择排序是排序算法的一种,这里以从小到大排序为例进行讲解. 基本思想及举例说明 选择排序(从小到大)的基本思想是,首先,选出最小的数,放在第一个位置:然后,选出第二小的数,放在第二个位置:以此类推,直到所有的数从小到大排序. 在实现上,我们通常是先确定第i小的数所在的位置,然后,将其与第i个数进行交换. 下面,以对 3  2  4  1 进行选择排序说明排序过程,使用min_index 记录当前最小的数所在的位置. 第1轮 排序过程 (寻找第1小的数所在的位置) 3  2  4  1(最初, m

  • C语言 实现归并排序算法

    C语言 实现归并排序算法 归并排序(Merge sort)是创建在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 一个归并排序的例子:对一个随机点的链表进行排序 算法描述 归并操作的过程如下: 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 设定两个指针,最初位置分别为两个已经排序序列的起始位置 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 重复步骤3直到某一指针到达序列尾

  • C语言 奇偶排序算法详解及实例代码

    C语言奇偶排序算法 奇偶排序,或奇偶换位排序,或砖排序,是一种相对简单的排序算法,最初发明用于有本地互连的并行计算.这是与冒泡排序特点类似的一种比较排序.该算法中,通过比较数组中相邻的(奇-偶)位置数字对,如果该奇偶对是错误的顺序(第一个大于第二个),则交换.下一步重复该操作,但针对所有的(偶-奇)位置数字对.如此交替进行下去. 使用奇偶排序法对一列随机数字进行排序的过程 处理器数组的排序 在并行计算排序中,每个处理器对应处理一个值,并仅有与左右邻居的本地互连.所有处理器可同时与邻居进行比较.交

  • c语言实现奇偶排序算法

    =====第2题:奇偶排序(一)===== 总时间限制:1000ms内存限制:65536kB描述输入十个整数,将十个整数按升序排列输出,并且奇数在前,偶数在后.输入输入十个整数输出按照奇偶排序好的十个整数 复制代码 代码如下: #include<stdio.h> #define  COUNT 10#define bool int#define true 1#define false 0 /*****负责冒泡排序***/int* sortFunction(int data[]){ int i,j

  • c语言5个常用的排序算法实例代码

    1.插入排序 基本思想:插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. void insertSort(vector<int>& nums) { int k = 0; for (int i = 0; i < nums.size(); ++i) { int temp = nums[i]; int j = i; for (; j > 0 && temp < nums[j-1]; --j) nums[j] =

  • C语言完整实现12种排序算法(小结)

    目录 1.冒泡排序 2.插入排序 3.折半插入排序 4.希尔排序 5.选择排序 6.鸡尾酒排序 7.堆排序 8.快速排序 9.归并排序 10.计数排序 11.桶排序 12.基数排序 1.冒泡排序 思路:比较相邻的两个数字,如果前一个数字大,那么就交换两个数字,直到有序.时间复杂度O(n^2),稳定性:这是一种稳定的算法.代码实现: void bubble_sort(int arr[],size_t len){ size_t i,j; for(i=0;i<len;i++){ bool hasSwa

  • 使用C语言实现12种排序方法

    1.冒泡排序 思路:比较相邻的两个数字,如果前一个数字大,那么就交换两个数字,直到有序. 时间复杂度O(n^2),稳定性:这是一种稳定的算法. 代码实现: void bubble_sort(int arr[],size_t len){ size_t i,j; for(i=0;i<len;i++){ bool hasSwap = false; //优化,判断数组是否已经有序,如果有序可以提前退出循环 for(j=1;j<len-i;j++){ //这里j<len-i是因为最后面的肯定都是最

  • C#几种排序算法

    作者:Sabine [导读]本文介绍了C#的四种排序算法:冒泡排序.选择排序.插入排序和希尔排序 冒泡排序 using System: namespace BubbleSorter { public class BubbleSorter { public void Sort(int [] list) { int i,j,temp: bool done=false: j=1: while((j<list.Length)&&(!done)) { done=true: for(i=0:i&

  • python如何实现常用的五种排序算法详解

    一.冒泡排序 原理: 比较相邻的元素.如果第一个比第二个大就交换他们两个 每一对相邻元素做同样的工作,直到结尾最后一对 每个元素都重复以上步骤,除了最后一个 第一步: 将乱序中的最大值找出,逐一移到序列最后的位置 alist = [3, 5, 9, 2, 1, 7, 8, 6, 4] def bubble_sort(alist): # 找最大值的方式是通过对列表中的元素进行两两比较,值大的元素逐步向后移动 # 序列中有n个元素,两两比较的话,需要比较n-1次 for i in range(len

  • Python实现12种降维算法的示例代码

    目录 为什么要进行数据降维 数据降维原理 主成分分析(PCA)降维算法 其它降维算法及代码地址 1.KPCA(kernel PCA) 2.LDA(Linear Discriminant Analysis) 3.MDS(multidimensional scaling) 4.ISOMAP 5.LLE(locally linear embedding) 6.t-SNE 7.LE(Laplacian Eigenmaps) 8.LPP(Locality Preserving Projections) 网

  • PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】

    本文实例讲述了PHP四种排序算法实现及效率分析.分享给大家供大家参考,具体如下: PHP的四种基本排序算法为:冒泡排序.插入排序.选择排序和快速排序. 下面是我整理出来的算法代码: 1. 冒泡排序: 思路:对数组进行多轮冒泡,每一轮对数组中的元素两两比较,调整位置,冒出一个最大的数来. //简单版: function bubbleSort($arr) { $n = count($arr); for($i=1;$i<$n;$i++) { //冒泡的轮数(最多$n-1轮) for($j=0;$j<

  • Python数据结构与算法(几种排序)小结

    Python数据结构与算法(几种排序) 数据结构与算法(Python) 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 冒泡排序算法的运作如下: 比较相邻的元素.如果第一个比第二个大(升序),就交换他们两个. 对每一对相邻元素作同样的工作,从

  • Java实现8种排序算法的示例代码

    冒泡排序 O(n2) 两个数比较大小,较大的数下沉,较小的数冒起来. public static void bubbleSort(int[] a) { //临时变量 int temp; //i是循环次数,也是冒泡的结果位置下标,5个数组循环5次 for (int i = 0; i < a.length; i++) { //从最后向前面两两对比,j是比较中下标大的值 for (int j = a.length - 1; j > i; j--) { //让小的数字排在前面 if (a[j] <

  • JavaScript实现的七种排序算法总结(推荐!)

    目录 前言 冒泡排序 基础算法 第二种写法是在基础算法的基础上改良而来的: 选择排序 基础算法 二元选择排序-优化 插入排序 交换法插入排序 移动法 希尔排序 堆排序 快速排序 归并排序 总结 前言 所谓排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序.这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的数据便于筛选和计算,大大提高了计算效率.对于排序,我们首先要求其具有一定的稳定性,即当两个相同的元素同时出现于某个序列之中,则经过一定的排序算法之后,两者在排序前

随机推荐