*排序
所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
稳定性
在待排序的数组中,如果出现多个相同的关键字,例如:98751555512,中出现重复的数字,在排好序以后,相同数字之间的位置不能发生改变,这种排序算法称为稳定的,否则为不稳定。
排序方法有:插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、合并排序、计数排序,其中计数排序是不需要进行比较的排序
插入排序
插入排序:简单来说,就是把每个元素按照大小,插入到有序数列中。因此,插入排序将带排序列分为两部分,一部分为有序,另一部分无序,就是将无序的元素依次插入到有序部分当中。

void insertionSort(int a[], int size)
{//待排序列从i ~ size for (int i = 0; i < size; ++i){//将带排序列中第一个元素int key = a[i];int j;// 下标0~j的序列为有序序列,从后往前遍历,如果遇到比无序序列中第一个元素小的,将每个元素后移for (j = i - 1; j >= 0 && a[j] > key; --j)  {a[j + 1] = a[j];}//将无序元素中的第一个插入到有序序列中a[j + 1] = key;}
}

希尔排序
例如:9 8 7 6 5 4 3 2 1 中
当gap = 4时 , 9 与 5进行比较,因为5小所以交换位置,5 与 1进行比较,
当gap = 2时,同理进行比较
当gap = 1时,元素已经有序。

void insertSortWithGap(int a[], int size)
{int gap = size / 3 + 1;while (gap != 1){for (int i = 0; i < size; ++i){int key = a[i];int j;//元素与同它间隔gap个元素比较for (j = i - gap; j >= 0 && a[j] > key; j -= gap){a[j + gap] = a[j];}a[j + gap] = key;}gap = gap / 3 + 1;}
}

选择排序
选择排序,就是在一组序列中,选出最小的或者最大的元素,将其让到有序序列中最后一个或者最前一个。

  1. 解法一:找出最小值(最大值),并将其放到有序序列最后面(最前面)。
void selectSort(int a[], int size)
{for (int i = 0; i < size; ++i){int min = size - 1;for (int j = i; j < size; ++j){if (a[j] < a[min]){min = j;}}swap(&a[i], &a[min]);}
}
  1. 解法二:同时找出最大值与最小值,将最大值放在前面有序序列的最后面,将最大值放在后面有序序列的最前面。
    无序数组 i ~ size - i - 1
    有序数组 0 ~ i 与 size - i -1 ~ size - 1
void selectSort2(int a[],int size)
{//因为无序数列   i~size-i-1 for (int i = 0; i < size - i; i++){int min = size - 1;int max = 0;for (int j = i; j < size - i; j++){if (a[min] > a[j]){min = j;}if (a[max] < a[j]){max = j;}}//将无序数列中最小的元素,与有序数列中,最后一个元素的下一个位置进行交换swap(&a[i], &a[min]);//如果无序数列第一个数就是其最大元素,因为上面将其位置进行交换了,所以最大元素的地址就为之前的最小元素的位置if (max == i){max = min;}swap(&a[max], &a[size - i - 1]);}
}

快速排序
快速排序就是找一个基准值,将比基准值小的放在左边,比基准值大的放在右边,就将待排序列分为两部分,一部分是比基准值小的,一部分是比基准值大的,最后在对左右两部分重复上面的方法,直到数组有序。
在一次遍历以后,左边全都为小于基准值的,右边全为大于基准值的。

int Quick_Sort(int a[], int left, int right)
{int begin = left;int end = right;int key = a[right];while (begin < end){while (begin < end&&a[begin] <= key){begin++;}while (begin<end&&a[end]>= key){end--;}swap(&a[begin], &a[end]);}swap(a + begin, a + right);return begin;
}void quickSort(int a[], int left, int right)
{if (left >= right){return;}int i = Quick_Sort(a, left, right - 1);quickSort(a, left, i);quickSort(a, i + 1, right);
}

堆排序
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。

  • 创建堆

按照下标的形式进行建堆

void createHeap(int a[], int size)
{for (int i = (size - 2) / 2; i >= 0; --i){heapify(a, size, i);}
}

//建小堆(双亲结点的值比左右孩子结点的值都小)

void heapify(int a[], int size, int i)
{int left = i * 2 + 1;int right = i * 2 + 2;if (left >= size){return;}int min = left;if (right < size && a[right] < a[min]){min = right;}if (a[i] < a[min]){return;}swap(a[i], a[min]);heapify(a, size, min);//不断进行向下调整
}

//建大堆

void  heapitf(int a[], int size, int index)//建大堆,降序排列
{int left = index * 2 + 1;int right = index * 2 + 2;if (left >= size){return;}int max = left;if (right < size && a[right] >a[left]){max = right;}if (a[index] >= a[max]){return;}int temp = a[max];a[max] = a[index];a[index] = temp;heapitf(a, size, max);
}

运行结果:

归并排序
归并排序,运用分治法的思想,将问题规模不断进行缩减,最终将所有的结果进行合并就得出原问题的解。在排序中,例如:8 7 6 5 4 3 2 1这一串数字进行排序,先将问题分为8 7 6 5一组 4 3 2 1 一组进行排序,如果还无法排序就进一步将问题进行划分,最终再将排好序的元素进行整合。

void Merge(int *a, int left, int mid, int right)
{int *temp = (int *)malloc(sizeof(int)*(right - left));int index = 0;int l = left;int m = mid + 1;while (l <= mid&&m <= right){if (a[l] <= a[m]){temp[index++] = a[l++];}else{temp[index++] = a[m++];}}while (l <= mid){temp[index++] = a[l++];}while (m <= right){temp[index++] = a[m++];}for (int i = 0, j = left; j <= right; ++j){a[j] = temp[i++];}
}void Mergesort(int* a, int left, int right)
{if (left >= right)return;int mid = left + ((right - left) >> 1);Mergesort(a, left, mid);Mergesort(a, mid + 1, right);Merge(a, left, mid, right);

计数排序

void CountSort(int *a, int size)
{int min = a[0];int max = a[0];int index = 0;for (int i = 0; i < size; ++i){if (a[i] < min){min = a[i];}if (a[i] > max){max = a[i];}}int range = max - min + 1;int *temp = (int*)calloc(range, sizeof(int));for (int i = 0; i < size; ++i){temp[a[i] - min]++;}for (int i = 0; i < range; i++){while (temp[i]--){a[index++] = i + min;}}free(temp);temp = NULL;
}

堆排序代码
先创建大顶堆,在不断进行调整

void adjust(vector<int>& arr, int index, int size)
{int left = index * 2 + 1;int right = index * 2 + 2;int max = index;if (left<size && arr[left]>arr[max])max = left;if (right<size && arr[right] >arr[max])max = right;if (max != index){swap(arr[max], arr[index]);adjust(arr, max, size);}}//对大顶堆进行不断调整
void heapSort(vector<int>& arr, int size)
{for (int i = size / 2 - 1; i >= 0; --i){adjust(arr, i, size);}for (int i = size - 1; i >= 0;i--){swap(arr[0], arr[i]);adjust(arr,0,i);}for (int i = 0; i < size; ++i)cout << arr[i] << " ";
}

数据结构—排序算法总结(插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、合并排序、计数排序)相关推荐

  1. 数据结构:直接插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 归并排序

    一.什么是排序 排序就是将一组杂乱无章的数据按照一定的次序组织起来,此次序可以是升序也可以是降序 二.为什么需要进行排序 为了满足一些需求,比如在比较学生的成绩时,我们就需要给所有学生的成绩排一个顺序 ...

  2. java语言冒泡排序法_Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等...

    本文实现了八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序 首先是EightAlgorithms.java文件,代码如下: import jav ...

  3. 【Java】八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序

    这篇文章主要介绍了Java如何实现八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序,需要的朋友可以参考下 本文实现了八个常用的排序算法:插入排序 ...

  4. 对以下6种常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。

    题目要求: (1)对以下6种常用的内部排序算法进行比较:起泡排序.直接插入排序.简单选择排序.快速排序.希尔排序.堆排序. (2)待排序表的表长不小于100:其中的数据要用伪随机数产生程序产生:至少要 ...

  5. java数据结构排序实验报告_java数据结构与算法之插入排序详解

    本文实例讲述了java数据结构与算法之插入排序.分享给大家供大家参考,具体如下: 复习之余,就将数据结构中关于排序的这块知识点整理了一下,写下来是想与更多的人分享,最关键的是做一备份,为方便以后查阅. ...

  6. 数据结构与算法:十大排序算法之插入排序

    数据结构与算法:十大排序算法之插入排序 package TopTenSortingAlgorithms;import java.util.Arrays; import java.util.Scanne ...

  7. java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序...

    算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...

  8. java排序算法(插入排序,冒泡排序,选择排序)

    java排序算法(插入排序,冒泡排序,选择排序) 先了解原理,然后自己跟着敲一下,加深印象 CMD编译命令:javac -encoding utf-8 SortList.java && ...

  9. Java 与排序算法(2):选择排序

    一.选择排序 选择排序(Selection Sort)是一种简单的排序算法,其基本思想是在待排序序列中选择最小(或最大)的元素,将其与序列的第一个元素交换位置,然后在剩余的元素中继续选择最小(或最大) ...

  10. 插入排序算法 java_排序算法实现-插入排序(Java版本)

    原标题:排序算法实现-插入排序(Java版本) 插入排序(英语:Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到 ...

最新文章

  1. 廖雪峰python教程视频-为什么看不懂廖雪峰的Python学习教程?
  2. 理科的至尊思想:进制之间的转换
  3. spring4声明式事务--01注解方式
  4. wxWidgets:wxChoicebook类用法
  5. struts-execl.xml
  6. 基于easyui开发Web版Activiti流程定制器详解(六)——Draw2d的扩展(一)
  7. Eclipse设置:背景与字体大小和xml文件中字体大小调整
  8. SpringBoot 整合swagger3.X
  9. 样条曲线_概念设计:如何控制相关样条曲线几何图形?
  10. 为什么Python中万物皆对象
  11. lisp实心圆点怎么画_实心小圆点符号怎么打
  12. C盘Temp文件夹的内容可以删掉
  13. FPGA,关于安装使用libero IDE V9.2 及其gold floating license配置
  14. Oracle常见授权与回收权限——grant和revoke
  15. 2022全球新能源与智能汽车供应链创新大会|爱普搜同期项目对接会
  16. 【UE4】Object has overlapping UVs不借助外部软件就能解决的方法
  17. 大数据中技术的定义和特点
  18. 铁路巡检及指挥调度系统
  19. 信息爆炸的时代,太早进入社会不是好选择
  20. 计算机应用基础有必要学吗,计算机应用基础教学革新的必要性

热门文章

  1. fishhook源码分析
  2. 自制 python 数据分析库
  3. 苹果原生NSURLSession的上传和下载
  4. 小量数据和海量数据分页显示存储过程
  5. 控件制作之design-time attribute
  6. spring配置mysql事务管理_Spring 数据库事务管理机制
  7. X86汇编语言从实模式到保护模式10:进入保护模式
  8. 【工程项目经验】查看gcc arch编译选项
  9. 【工程项目经验】函数编译可见性
  10. C语言变量声明问题——变量定义一定要放在所有执行语句/语句块的最前面吗?