排序之冒泡排序、插入排序及希尔排序

1、冒泡排序

基本思想:对于每一趟的排序,从第一个数开始,依次比较前一个数与后一个数的大小。

如果前一个数比后一个数大,则进行交换。这样一轮过后,最大的数将会出现在最末位的位置。

第二轮则去掉最后一个数,对前n-1个数再按照上面的步骤找出最大数,该数将出现在倒数第二的位置。

n-1轮过后,就完成了排序。

,举例:冒泡排序1,5,2,3,9,8,6,

第一趟:,1<5,不换,5>2,交换1 2 5,3, 9 8,6

5>3交换,1 2 3 5 9 8,6

5<9不换,9>8交换,1 2 3 5 8 9,6,9>6交换,1 2 3 5 8 6 9         9的位置固定

第二趟:1<2不换,2<3不换,3<5不换,5<8不换,8>6交换1 2 3 5 6 8 9    8的位置固定

依次迭代

 N个数最坏情况下比较次数:1+2+......+N-1

2、插入排序

基本思想:将待插入记录R[i]的关键字从右向左依次与有序区中记录R[j](j=i - 1, i - 2, ....,1)的关键字比较:

若R[j]的关键字大于R[i]的关键字,则将R[j]后移一个位置

若R[j]的关键字小于或等于R[i]的关键字,则查找过程结束,j + 1即为R[i]插入位置

举例:插入排序:34,8,64,51,32,21

假设一开始有数字:34    8<34       8 34

64>34          8 34 64

51<64 51>34    8 34 51 64

32<64 32<51 32<34  32>8    8 32 34 51 64

21<64 21<51 21<34 21<32 21>8       8 21 32 34 51 64

插入和冒泡,每次交换2个相邻元素时,正好消去1个逆序对。(下表i<j,如果A[i]>A[j]则称(i,j)为一对逆序对)
如果序列基本有序,则插入排序简单且高效。
任意N个不同元素组成的序列平均具有N(N-1)/4个逆序对
任何仅以交换相邻元素来排序的算法,其平均时间复杂度为欧美阁(N*N)

3、希尔排序

克服了前两种排序每次只交换相邻元素来排序的问题。

基本思想:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量D”的元素组成的),分别对相隔D的元素进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-07 10:12:59

排序之冒泡排序、插入排序及希尔排序的相关文章

【数据结构与算法】内部排序之一:插入排序和希尔排序的N中实现(不断优化,附完整源码)

转载请注明出处:http://blog.csdn.net/ns_code/article/details/20043459   前言 本来想将所有的内部排序总结为一篇博文,但是随着研究的深入,还是放弃了这个念头,斟前酌后,还是觉得分开来写比较好,具体原因,看完本篇博文也就自然明了了. 本篇文章主要探讨插入排序和希尔排序,之所将二者放在一起,很明显,是因为希尔排序是建立在插入排序的基础之上的.     注:以下各排序算法的N种实现方法大部分都是我根据算法思想,自己写出来的,或者是参考其本身的经典实

排序算法1——插入排序,希尔排序

插入排序: #include <iostream> using namespace std; void insert(int *arry, int lo, int current) { while (lo >= 0 && arry[lo] < current) { arry[lo + 1] = arry[lo]; lo--; } arry[lo + 1] = current; } void print(int *arry, int size) { for (int

数据结构与算法——插入类排序(直接插入排序,希尔排序)

一.直接插入排序 对于一个有序的序列,不断将后面的元素插入前面的有序序列,保持序列继续有序. 对于直接插入排序的思路:将要排序的元素保存,然后逐个和其前面的元素进行比较,如果前面的元素比其大,则将前面的元素后移一个. 时间复杂度为n*n void insert_sort(int a[],int n) { int i,j; int temp; for(i=1;i<n;i++) { temp = a[i]; j=i-1; while((j>=0)&& (temp<a[j]))

1)③排序算法之插入排序[2]希尔排序

1 #include<iostream> 2 using namespace std; 3 4 int shell_sort(int n,int array[100]){//希尔排序法 5 register int dh,temp,i,j; 6 dh=n/2; 7 while(dh>=1){ 8 for( i=dh;i<n;i++){ 9 temp=array[i]; 10 j=i-dh; 11 while(j>=0&&array[j]>temp){ 1

C# 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序

下面列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序,然后是测试的例子.代码位置:http://download.csdn.net/detail/luozuolincool/8040027 排序类: public class Sortings { //插入排序 public void insertSort(int[] array) { int temp = 0; int index = 0; for (int i = 0; i <

直接插入排序、二分插入排序、希尔排序、冒泡排序与简单选择排序

一.直接插入排序 稳定,时间复杂度:最好O(n).最差O(n^2).平均O(n^2),空间复杂度O(1) void InsertSort(int L[], int n) { int i, j,key; for (i = 1; i<n; i++) if(L[i] < L[i-1])//需要将L[i]插入到有序表L[0...i-1] { key = L[i]; for(j = i-1; j >= 0 && key < L[j]; j--)//后移 L[j+1] = L[

七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)

 写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.因此排序掌握各种排序算法非常重要.对下面介绍的各个排序,我们假定所有排序的关键字都是整数.对传入函数的参数默认是已经检查好了的.只是简单的描述各个算法并给出了具体实现代码,并未做其他深究探讨. 基础知识: 由于待排序的记录数量不同,使得排序过程中设计的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机随机存储器中进行的排序过程.另一类是外部排序,

各种常见的排序,冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,基数排序,桶排序

各种常见的排序 要开始找工作了,把以前学的各种小知识复习一遍,以下是各种常见的排序的简单实现(冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,基数排序,桶排序),至于原理就不写出来了,代码比较简单,看一下就懂,再不行可以随意找本书或百度! #include <iostream> using namespace std; // 冒泡 void BubbleSort(int data[], int length) { if(data == NULL || length <= 0)

冒泡排序,快速排序,归并排序,插入排序,希尔排序,堆排序,计数排序,桶排序,基数排序

选择排序,冒泡排序,快速排序,归并排序,插入排序,希尔排序,计数排序,桶排序,基数排序 以上是一些常用的排序算法. 选择排序 for(int i = 0; i < n; i++) { int minval = a[i]; int minid = i; for (int j = i+1; j < n; j++) { if (a[j] < minval) { minid = j; minval = a[j]; } } swap(a[i], a[minid]); } 最简单的就是选择排序,就是

Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。

Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2).是稳定的排序方法.插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素).在第一部分排序完成后,再将这