数据结构(复习排序算法)——选泡插(选择,冒泡,插入,希尔)

#include <stdio.h>

/**
*  希尔排序(优化)
*  平均时间复杂度:O(n^1.3)
*  平均空间复杂度:O(1)
*  稳定性:不稳定
*  思想理念:分组,进行每个gap都进行除以2,
*  这样大组分小,有利于数据的移动变小
**/
void shell_sort(int a[],int len){
    for(int gap=len>>2;gap>0;gap/=2){
            for(int i=gap;i<len;i++){
                int j,tmp=a[i];
                for(j=i;j>0&&tmp<a[j-gap];j-=gap){
                        a[j]=a[j-gap];
                }
                a[j]=tmp;
            }
    }
}

/**
*  插入排序(优化)
*  平均时间复杂度:O(n^2)
*  平均空间复杂度:O(1)
*  稳定性:稳定
*  思想理念:从前到后进行循环,从后到前循环,
*  如果前比后大,用一个下标记住,循环结束之后
*  进行交换
**/
void insertion_sort_update(int a[],int len){
    for(int i=1;i<len;i++){
        int j,tmp=a[i];
        for(j=i;j>0&&tmp<a[j-1];j--){
                a[j]=a[j-1];
        }
        a[j]=tmp;
    }
}

/**
*  插入排序
*  平均时间复杂度:O(n^2)
*  平均空间复杂度:O(1)
*  稳定性:稳定
*  思想理念:从前到后进行循环,从后到前循环,
*  如果前比后大,那么交换
**/
void insertion_sort(int a[],int len){
    for(int i=1;i<len;i++){
        for(int j=i;j>0&&a[j]<a[j-1];j--){
                int tmp=a[j];
                a[j]=a[j-1];
                a[j-1]=tmp;
        }
    }
}

/**
*  选择排序
*  平均时间复杂度:O(n^2)
*  平均空间复杂度:O(1)
*  思想理念:从前到后进行选择,选择最小
*  与最开始的数字进行交换
**/
void selection_sort(int a[],int len){
    for(int i=0;i<len-1;i++){
        int min_num=i;
        for(int j=i+1;j<len;j++){
            if(a[j]<a[min_num]) min_num=j;
        }
        int tmp=a[min_num];
        a[min_num]=a[i];
        a[i]=tmp;
    }
}

/**
*  冒泡排序
*  平均时间复杂度:O(n^2)
*  平均空间复杂度:O(1)
*  思想理念:从后向前进行起泡,
*  每个泡泡能够使最大数字浮起来,
*  从而达到排序效果
**/
void bubble_sort(int a[],int len){
    for(int i=len-1;i>=0;i--){
        for(int j=1;j<=i;j++){
            if(a[j]<a[j-1]){
                int tmp=a[j];
                a[j]=a[j-1];
                a[j-1]=tmp;
            }
        }
    }
}

int main()
{
    int a[]={5,1,4,7,8,6,2};
    shell_sort(a,sizeof(a)/sizeof(int));
    for(int i=0;i<sizeof(a)/sizeof(int);i++) printf("%d ",a[i]);
    system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/littlepage/p/11444482.html

时间: 2024-10-14 05:43:43

数据结构(复习排序算法)——选泡插(选择,冒泡,插入,希尔)的相关文章

【数据结构】——排序算法——3.1、选择排序

      [数据结构]--排序算法--3.1.选择排序 一.先上维基的图: 分类 排序算法 数据结构 数组 最差时间复杂度 О(n2) 最优时间复杂度 О(n2) 平均时间复杂度 О(n2) 最差空间复杂度 О(n) total, O(1)auxiliary 二.描述: 选择算法算是最直观的一个了.每次在队列里抽取一个极大(或极小)值进行排列.每次都需要遍历未被抽取的元素队列. 三.Java程序: static void selection_sort(int[] unsorted) { for

数据结构之排序算法Java实现(6)—— 插入类排序之折半插入排序算法

折半插入排序是对直接插入排序进行了改进,在寻找插入点时使用二分查找算法,提高了查询效率. 升序排序: /** * 折半插入排序 * 升序排序 */ @Override public <T extends Comparable<? super T>> void sortByAsc(T[] data) { for(int i = 1;i < data.length;i++ ){ if(data[i].compareTo(data[i - 1]) < 0){ /**记录i的值

数据结构-各类排序算法总结[续]

各类排序算法总结 三.交换类排序[接上] 2.快速排序 快速排序是通过比较关键码.交换记录,以某个记录为界(该记录称为支点),将待排序列分成两部分.其中,一部分所有记录的关键码大于等于支点记录的关键码,另一部分所有记录的关键码小于支点记录的关键码.我们将待排序列按关键码以支点记录分成两部分的过程,称为一次划分.对各部分不断划分,直到整个序列按关键码有序. 如果每次划分对一个元素定位后,该元素的左侧子序列与右侧子序列的长度相同,则下一步将是对两个长度减半的子序列进行排序,这是最理想的情况! [算法

数据结构—各类‘排序算法’实现(上)

数据结构中的排序算法分为比较排序,非比较排序.比较排序有插入排序.选择排序.交换排序.归并排序,非比较排序有计数排序.基数排序.下面是排序的具体分类: 1.直接排序 主要思想:使用两个指针,让一个指针从开始,另一个指针指向前一个指针的+1位置,两个数据进行比较 void InsertSort(int* a, size_t size) {      assert(a);      for (size_t i = 0; i < size - 1; i++)      {           int 

数据结构基础 排序算法(一) 概念篇

本辑将会对笔试面试最常涉及到的12种排序算法(包括插入排序.二分插入排序.希尔排序.选择排序.冒泡排序.鸡尾酒排序.快速排序.堆排序.归并排序.桶排序.计数排序和基数排序)进行详解.每一种算法都有基本介绍.算法原理分析.图解演示.算法代码.笔试面试重点分析.笔试面试题等板块. 一.插入排序 1)算法简介 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常

数据结构-各类排序算法总结[结局]

各类排序算法总结 五.分配类排序->基数排序: 基数排序是一种借助于多关键码排序的思想,是将单关键码按基数分成"多关键码"进行排序的方法.基数排序属于"低位优先"排序法,通过反复进行分配与收集操作完成排序. 对于数字型或字符型的单关键字,可以看成是由多个数位或多个字符构成的多关键字, 此时可以采用这种"分配-收集"的办法进行排序,称作基数排序法.其好处是不需要进行关键字间的比较. 例如:对下列这组关键字{278, 109, 063, 930

【数据结构】——排序算法——1.1、直接插入排序

插入算法很多,无论是在内功修炼,各种笔试面试都是相当有用的.接下来,将陆续将各种排序算法进行练习: 主要分为以下几个部分(其他后面学习补充): 一.插入类排序:1.直接插入排序:2.折半插入排序:3.希尔shell排序: 二.交换类排序:1.冒泡排序 :2.快速排序: 三.选择类排序:1.简单选择: 2.堆排序: 本人多使用Java--开始吧! 首先推荐1.维基百科<排序算法>词条,图文并茂,很形象!2.学习博文<维基百科上的算法和数据结构链接很强大>,资料很多,保存学习! [数据

数据结构-各类排序算法总结

各类排序算法总结 一. 排序的基本概念 排序(Sorting)是计算机程序设计中的一种重要操作,其功能是对一个数据元素集合或序列重新排列成一个按数据元素某个项值有序的序列. 有 n 个记录的序列{R1,R2,-,Rn},其相应关键字的序列是{K1,K2,-,Kn},相应的下标序列为1,2,-,n.通过排序,要求找出当前下标序列1,2,-, n 的一种排列p1,p2, -,pn,使得相应关键字满足如下的非递减(或非递增)关系,即:Kp1≤Kp2≤-≤Kpn,这样就得到一个按关键字有序的记录序列{R

#排序算法#【2】直接插入排序、希尔排序

直接插入排序法 插入排序的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后移动,为最新元素提供插入空间. 核心代码: //直接插入排序法 void InsertSort(int a[],int n){ int i,j,k,t; for(i = 1 ; i<n;i++){ k = a[i]; /* 第一次比较粗糙的写法 j = i-1; while(

复习数据结构:排序算法(一)——插入排序

从这一篇开始,计划复习一下数据结构的基本知识.一来是为了开年之后的找工作,二来是为了想提升自己的编程能力.由于这些数据结构知识点,之前都学习过,这里我们就提炼出每个知识点的核心,以及代码实现. 这篇先说排序算法中的插入排序. 插入排序是一种稳定排序算法,属于内排序.适合少量数据量的排序. 当输入数组已经排好序时,插入排序需要O(n),快排需要O(n^2). 当输入数组倒序排列时,插入排序时复为:O(n^2). 平均时间复杂度:O(n^2). 代码实现如下: #include<iostream>