排序系列之——冒泡排序、插入排序、选择排序

排序之——冒泡排序:

基本思想:假设待排序表长为N,从后往前(或者从前往后)两两比较相邻元素的值,若为逆序(arr[i-1]>arr[i]),则交换他们,直到序列比较完。这时一趟冒泡。

代码如下:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <time.h>
 5 #define N 20
 6
 7 void print_Arr(int *arr, int len)
 8 {
 9     int i;
10     for (i = 0; i < len; ++i)
11     {
12         printf("%4d", arr[i]);
13     }
14     printf("\n");
15 }
16
17 void init_Arr(int *arr, int len)
18 {
19     int i = 0;
20     while( i < len)
21     {
22         arr[i] = rand()%1000 ;
23         ++i;
24     }
25 }
26
27 void swap(int* left, int *right)
28 {
29     int tmp = *left;
30     *left = *right;
31     *right = tmp;
32 }
33
34 void BubbleSort(int *arr, int len) //双向冒泡,即一个来回确定 最顶端和最底端位置
35 {
36     int up = 0;
37     int down = len-1;
38
39     int i, j; //用于遍历
40     while( up <= down)
41     {
42         for(i = up; i < down; ++i) //将最大元素放置在末尾
43         {
44             if( arr[i] > arr[i+1])
45                 swap( &arr[i], &arr[i+1]);
46         }
47         --down ;
48         if(up == down)
49             break;
50         for(j = down; j > up; --j)//将最小元素放置在顶端
51         {
52             if(arr[j] < arr[j-1])
53                 swap(&arr[j], &arr[j-1]);
54         }
55         ++up;
56     }
57 }
58
59 int main(int argc, char const *argv[])
60 {
61     srand(time(NULL));
62
63     int arr[N];
64     init_Arr(arr, N);
65     printf("Before:\n");
66     print_Arr(arr, N);
67
68     BubbleSort(arr, N);
69     printf("After\n");
70     print_Arr(arr, N);
71     return 0;
72 }

性能分析:
空间复杂度O(1),最坏情况下时间复杂度为O(N*N),最好情况下(表中元素基本有序)时间复杂度为O(N),其平均时间复杂度为O(N*N);

稳定性:是一个稳定的排序方法。

排序之——插入排序:

基本思想:

1、依次将arr[1]~arr[len-1]插入到前面已排序序列

2、进行排序时,设置一个哨兵,用于保存每次要插入的元素(目的:减少交换次数);

3、从后往前查找待插入的位置。

代码如下:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <time.h>
 5 #define N 20
 6 //打印函数
 7 void print_Arr(int *arr, int len)
 8 {
 9     int i;
10     for (i = 0; i < len; ++i)
11     {
12         printf("%4d", arr[i]);
13     }
14     printf("\n");
15 }
16 //初始化函数
17 void init_Arr(int *arr, int len)
18 {
19     int i = 0;
20     while( i < len)
21     {
22         arr[i] = rand()%1000 ;
23         ++i;
24     }
25 }
26 //插入排序
27 void InsertSort(int *arr, int len)
28 {
29     if( len <=1 )
30         return ;
31
32     int pos, index;
33     int key;
34     for( pos = 1; pos < len; ++pos) //依次将arr[1]~arr[len-1]插入到前面已排序序列
35     {
36         key = arr[pos];//复制为哨兵
37         for( index = pos-1; index >=0; --index) //找到要插入的位置
38         {
39             if(arr[index] > key) //从小到大排列
40                 arr[index +1] = arr[index];//向后移动
41             else //找到要插入的位置
42                 break;
43         }
44         arr[index+1] = key;
45     }
46 }
47
48 int main(int argc, char const *argv[])
49 {
50     int arr[N];
51     init_Arr(arr, N);
52     printf("Before:\n");
53     print_Arr(arr, N);
54
55     InsertSort(arr, N);
56     printf("After\n");
57     print_Arr(arr, N);
58     return 0;
59 }

性能分析: 空间复杂度O(1),最坏情况下时间复杂度为O(N*N),最好情况下(表中元素基本有序)时间复杂度为O(N),其平均时间复杂度为O(N*N);

稳定性:插入排序是一个稳定的排序方法。

排序之——选择排序:

基本思想:每一趟在后面的n-i+1(i=1,2, 3···)个待排序列元素中选取一个最小的元素,作为有序子序列的第i个元素。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define N 20

void print_Arr(int *arr, int len)
{
    int i;
    for (i = 0; i < len; ++i)
    {
        printf("%4d", arr[i]);
    }
    printf("\n");
}

void init_Arr(int *arr, int len)
{
    int i = 0;
    while( i < len)
    {
        arr[i] = rand()%1000 ;
        ++i;
    }
}

void swap(int* left, int *right)
{
    int tmp = *left;
    *left = *right;
    *right = tmp;
}

void SelectSort(int *arr, int len)
{
    int pos, minpos, index;

    for (pos = 0; pos <len; ++pos)//比较趟数
    {
        minpos = pos;//设置每次最小值下标的初始值
        for( index = pos+1; index < len; ++index) //依次与后面的各个元素比较
        {
            if(arr[index] < arr[minpos])
                minpos = index;
        }
        if( minpos != pos) //如果最小值下标发生了变化,交换之
            swap(&arr[pos], &arr[minpos]);
    }
}

int main(int argc, char const *argv[])
{
    srand(time(NULL));

    int arr[N];
    init_Arr(arr, N);
    printf("Before:\n");
    print_Arr(arr, N);

    SelectSort(arr, N);
    printf("After\n");
    print_Arr(arr, N);
    return 0;
}

性能分析: 空间复杂度O(1),最坏情况下时间复杂度为O(N*N),最好情况下(表中元素基本有序)时间复杂度为O(N),其平均时间复杂度为O(N*N);

稳定性:简单排序是一个不稳定的排序方法。

其余排序详见 排序系列之——快速排序、堆排序、合并排序

时间: 2024-11-03 22:30:42

排序系列之——冒泡排序、插入排序、选择排序的相关文章

php排序介绍_冒泡排序_选择排序法_插入排序法_快速排序法

这里我们介绍一些常用的排序方法,排序是一个程序员的基本功,所谓排序就是对一组数据,按照某个顺序排列的过程. 充效率看 冒泡排序法<选择排序法<插入排序法 排序分两大类: 内部排序法 交换式排序法 冒泡法 基本思想: 冒泡排序法 案例: 1234567891011121314151617181920212223242526 //简单的$arr=array(0,5,-1); //现在我们把函数毛片封装成函数,利用以后使用//数组默认传递的是值,不是地址,&是地址符function bubb

常见排序集合(冒泡排序,选择排序,直接插入排序,二分插入排序,快速排序,希尔排序,归并排序)

一下是一些常见的排序算法: 交换元素(后面算法都有用到): // 交换元素 private static void swap(int[] a, int i, int j) { int temp; temp = a[i]; a[i] = a[j]; a[j] = temp; } 冒泡排序(有优化): // 冒泡排序(优化①,②,③,④) private static void bubbleSort(int[] a) { boolean flag = false;// ①表示整个序列是无序的 for

基础排序算法(冒泡排序,选择排序,插入排序)

最近经常调用api中的排序算法,很少自己写了,有时候也只写写快速排序这些比较快的排序,然而刚开始学排序时用的一些基本的排序算法却有点忘了 正好今天Java老师让我们每个人写个选择排序热热手,趁这个机会再来复习下一些基本的排序好了. 一.冒泡排序(稳定排序) 学编程接触到的第一个排序算法,基本思路就是,给定一个无序数组a0.a1.a2.a3....an; 通过从左到右相邻的元素两两比较,把最大或者最下的数依次放到数组的右边,最后得到有序的序列 public static void maoPao(i

【Java_Base】常用排序算法:冒泡排序、选择排序、插入排序

冒泡排序比较相邻的元素.如果第一个比第二个大,就交换他们两个.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数.针对所有的元素重复以上的步骤,除了最后一个.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. 选择排序对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置,接着第二次比较,前面“后一个元素”现变成了“前一个元素”,继续跟他的“后一个元素”进行比较如果后面的元素比他要小则用变

数组的排序算法(冒泡排序,选择排序,插入排序)

package j2se; /**  * Created by jingqing.zhou on 2015/6/16.  * 数组排序算法  */ public class inserSort {    /**     *冒泡排序     */     public static int[] bubbleSort(){         int[] arr = {10,5,7,45,11,-6,2};         for(int i=0;i<arr.length-1;i++){        

排序算法之一--冒泡排序,选择排序,插入排序

一.排序算法定义 1.排序算法定义 排序算法是一种能将一串数据依照特定顺序进行排列的一种算法 2.六种排序算法理解方式 想象小时候老师给我们按照身高进行排队时用到的方法,脑子里面要浮现老师排身高的场面   以从矮到高进行排序为例 3.稳定性的定义 一个排序算法是稳定的,当有两个相等键值的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前. 二.三种基本排序算法 1.冒泡排序:"移" 把最高的移到最右边 第一次循环,找到最高的那个人放到最右边       方法

常用排序法之一 ——冒泡排序法和选择排序法

语言中,常用的算法有:冒泡排序.快速排序.插入排序.选择排序.希尔排序.堆排序以及归并排序等等.那么从这篇开始,我将分别总结下这几种排序法. 先交代一下,我们将要排序的数组定义为arr[N],即数组arr[]包含N个元素. ## 冒泡排序法(Bubblesort) ## 所谓排序法,就是对一组无序的序列进行有序的排序(从大到小或者从小到大),那么什么叫冒泡排序法,冒泡排序法又是怎么实现数组的有序排列呢. 冒泡排序法的具体实现方法是这样的,从数组的第一个元素`arr[0]`开始,两两比较**(`a

数组排序-冒泡排序-插入排序-选择排序-Java实现

package org.lyk.entities; public class SortHelper { public static void BubbleSort(int[] array) { for(int i = array.length-1; i >= 1 ; i--) { for(int j = 0; j < i ; j++) { if(array[j] > array[j+1]) { int temp = array[j]; array[j] = array[j+1]; arr

冒泡排序,选择排序,插入排序

从今天开始希望自己的博客可以持续的更新起来,由于本人能力有限,所以有些内容可能会有疏漏或者不全面,希望大家可以指出来,让我们一起学习,一起进步. 今天的内容是最简单的三个排序算法,冒泡排序,选择排序,插入排序,它们的时间复杂度都是O(N^2). 冒泡排序:首先第一个数与第二个数比较,如果前面的大于后面的就交换两个数,然后第二个与第三个比较,直到比较到最后,此时最后一个数为数组最大值,然后循环次步骤,第二次比较到倒数第二位,这样经过两次循环最后两位就排好了,经过N次循环,数组就拍好了 选择排序:从

java面向对象的冒泡排序,选择排序和插入排序的比较

这三种排序有俩个过程: 1.比较俩个数据. 2.交换俩个数据或复制其中一项. 这三种排序的时间级别 冒泡排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2 交换  0——N2/2 = N2/4 总时间 3/4*N2 选择排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2 交换  0——3*(N-1)=3*(N-1)/2=3/2*N 总时间 N2/2+3/2*N 插入排序:第一轮最多比较一次,第二轮最多比较俩次,最后一轮比较N-1