数据结构--排序(上)--简单排序(冒泡,插入)

简单排序(冒泡,插入)

介绍两大类算法,一类是排序,一类是查找

前提:X是排序的算法 void X_sort( ElementType A[],int N) 。

N是正整数,只讨论基于比较的排序(< = >有定义)

只讨论内部排序(所有数据都可以导入内部空间)

稳定性:任意两个相等的数据,排序前后的相对位置不发生改变。

没有一种排序是任何情况下都表现最好的。

冒泡排序

第一次冒泡最大的泡泡一定在最下面。

void Bubble_sort(ElementType A[], int N){
    for(P=N-1;P>=0;P--){
        flag  = 0;            //这个标签可以判断一次循环里面有没有交换的
        for(i = 0 ; i< p ;i++){        //一趟冒泡
            if(A[i]<A[i+1]){
                swap(A[i],A[i+1]);
                flag = 1;
            }
        }
        if(flag == 0)
            break;   //全程无交换,可以退出了。
    }
}

最好情况顺序 T = O(n)

最坏情况逆序 T = O (n2)

A可以是数组 ,可以是链表。

插入排序

类似于扑克牌排序。

void Insertion_sort(ElementType A[], int N){
    for(P=1;P<N;P++){
        Tmp = A[P];    //摸下一张牌
        for(i = P ; i>0 && A[i-1]>Tmp  ;i--)        //一趟冒泡
            A[i] = A[i-1];  //移出空位
        A[i] = Tmp;      //新牌落位
    }
}

最好情况顺序 T = O(n)

最坏情况逆序 T = O (n2)

时间复杂度下界

定理:任意N个不同元素组成的序列平均具有N(N-1)/4个逆序对。

定理:任何仅以交换相邻逆序对来排序的算法,其平均时间复杂度是Ω(N2).

时间: 2024-10-24 11:43:22

数据结构--排序(上)--简单排序(冒泡,插入)的相关文章

Java中的几种排序算法:冒泡排序,插入排序,二分法排序,简单排序,快速排序

冒泡排序: int[] hehe={4,7,2,5,6,9,0}; for(int i=0;i<hehe.length;i++){ for(int j=i+1;j<hehe.length;j++){ if(hehe[i]>hehe[j]){ int temp=hehe[i]; hehe[i]=hehe[j]; hehe[j]=temp; } } } 插入排序 int[] a={13,7,8,9,10,1,2,32}; int i,j,t,h; for (i=1;i<a.length

选择排序之简单排序算法

1.1简单选择排序 属于选择排序 两两比较大小,找出极值(极大值或极小值)被放置在固定的位置,这个固定位置一般指的是 某一端 结果分为升序和降序排列 1.2降序 n个数从左至右,索引从0开始到n-1,两两依次比较,记录大值索引,此轮所有数比较完毕,将 大数和索引0数交换,如果大数就是索引1,不交换.第二轮,从1开始比较,找到最大值,将它 和索引1位置交换,如果它就在索引1位置则不交换.依次类推,每次左边都会固定下一个大数. 1.3升序 和降序相反 1.4区别于冒泡排序 冒泡排序,俩俩比较交换位置

Java数据结构系列之——简单排序:冒泡、简单选择、直接插入

package SimpleSort; public class SimpleSort { /** * 冒泡排序:每次循环过程中,小的排在后面的数会像水中的 * 气泡一样慢慢往上冒,所以命名为冒泡排序了,我猜是这样子的..... */ public void BubbleSort(int[] array){ for(int i=0;i<array.length;i++){ for(int j=array.length-1;j>i;j--){//注意此处j是从后往前循环 if(array[j-1

排序算法(简单排序,冒泡排序)

int[] a = new int[10]; for (int i = 0; i < a.length; i++) { a[i] = random(); System.out.print(a[i] + " "); } System.out.println(); int temp = 0; // 从小到大 // 简单选择排序法 // 方法1 int minIndex = 0; for (int i = 0; i < a.length - 1; i++) { minIndex

排序_简单排序_插入排序

插入排序有三个记录值,其中一个记录着取出来的一个值,也是需要插入的值,从第二个位置开始获取.另外两个初始位置是一样的,从第二个数值开始记录.这个的特点是每一次比较之前,当前假设的数组都是有序的. public class ArrayIns { private long a[]; private int nElems; public ArrayIns(int maxSize) { a=new long[maxSize]; nElems=0; } //插入 public void insert(lo

数据结构与算法之--高级排序:shell排序和快速排序【未完待续】

高级排序比简单排序要快的多,简单排序的时间复杂度是O(N^2),希尔(shell)排序的是O(N*(logN)^2),而快速排序是O(N*logN). 说明:下面以int数组的从小到大排序为例. 希尔(shell)排序 希尔排序是基于插入排序的,首先回顾一下插入排序,假设插入是从左向右执行的,待插入元素的左边是有序的,且假如待插入元素比左边的都小,就需要挪动左边的所有元素,如下图所示: ==> 图1和图2:插入右边的temp柱需要outer标记位左边的五个柱子都向右挪动 如图3所示,相比插入排序

简单排序算法设计(Java)

总共有八种排序算法,还是慢慢看吧 1.简单排序算法 简单排序算法就是设置标兵,逐个比较数,然后查找插入位置,插入 public static void p(int[] a){ for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } } public static void sorting(int[] a){ int m =a.length; for(int i=1;i<m;i++){ if(i==1){ if(a

数据结构-十大经典排序算法

常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 关于时间复杂度 平方阶 (O(n2)) 排序 各类简单排序:直接插入.直接选择和冒泡排序. 线性对数阶 (O(nlog2n)) 排序 快速排序.堆排序和归并排序: O(n1+§)) 排序,§ 是介于 0 和 1 之间的常数. 希尔排序 线性阶 (O(n)) 排序 基数排序,此外还有桶.箱排序. 关于稳定性 稳定的排序算法:冒泡排序.插入排序.归并排序和基数排序. 不是稳定的排序算

排序算法之简单排序(冒泡、选择、插入)

1.基本概念 内部排序和外部排序 根据排序过程中,待排序的数据是否全部被放在内存中,分为两大类: 内部排序:指的是待排序的数据存放在计算机内存中进行的排序过程: 外部排序:指的是排序中要对外存储器进行访问的排序过程. 内部排序是排序的基础,在内部排序中,根据排序过程中所依据的原则可以将它们分为5类:插入排序.交换排序.选择排序.归并排序:根据排序过程的时间复杂度来分,可以分为简单排序.先进排序.冒泡排序.简单选择排序.直接插入排序就是简单排序算法. 评价排序算法优劣的标准主要是两条:一是算法的运