/* 排序算法:冒泡,选择,插入,希尔,快速,归并,堆排序 */
#include <iostream>
#include <stdlib.h>
using namespace std;
//声明函数
void displayArray(int[] , int);
void swapValue(int[] , int ,int);
void shellSort(int[] , int);
void popperSort(int[] , int);
void popperSort2(int[] , int);
void chooseSort(int[] , int);
void chooseSort2(int[] , int);
void insertSort(int[] , int);
void insertSort2(int[] , int);
void fastSort(int[] , int , int);
void merge(int[] , int , int , int);
void mergeSort(int[] , int[] , int , int);
void heapSort(int[] , int);
void maxHeapTree(int[] , int);
void maxHeapNode(int[] , int , int);
int main()
{
int arr[6] = {3,4, 3,52,13,2};
//displayArray(arr , 10);
cout << "排序前,数组元素:" << endl;
displayArray(arr , 6);
//测试:希尔排序
shellSort(arr , 6);
//测试:插入排序法1
//insertSort(arr , 6);
//测试:插入排序法2
//insertSort2(arr , 6);
//测试:冒泡排序法1
//popperSort(arr , 6);
//测试:冒泡排序法2
//popperSort2(arr , 6);
//测试:选择排序法1
//chooseSort(arr , 6);
//测试:选择排序法2
//chooseSort2(arr , 6);
//测试:快速排序
//fastSort(arr , 0 , 5);
//测试:归并排序法
//mergeSort(arr , arr , 0 , 5);
// 测试:堆排序
//heapSort(arr , 6);
cout << "排序后,数组元素:" << endl;
displayArray(arr , 6);
return 0;
}
//希尔排序法
void shellSort(int arr[] , int length) {
int delta[3] = {5, 3 ,1};
int i = 0;
while(i < 3) { //遍历距离数
int dk = delta[i];
for(int k = dk; k < length; k++) {
if(arr[k] < arr[k-dk]) { //比较相距dk的两个元素大小
int t = arr[k] , j; //记录要插入的元素值
for(j = k-dk; j >= 0 && arr[j]>t; j=j-dk) { //遍历k-dk前面所有相距dk的元素,决定插入的位置
arr[j+dk] = arr[j]; //移动元素
}
arr[j+dk] = t; //癣元素插入到正确的位置
}
}
i++;
}
}
//冒泡排序法1
void popperSort(int arr[] , int length) {
int temp;
for(int i = 0; i < length - 1; i++) { //记录冒泡排序要遍历数组的次数
for(int j= length-1; j > i; j--) { //倒序遍历数组元素
if(arr[j] < arr[j-1]) {
temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
}
}
}
}
//冒泡排序法2
void popperSort2(int arr[] , int length) {
int temp;
for(int i = 0; i < length-1; i++) { //记录冒泡排序要遍历数组的次数
for(int j = 0; j < length-i+1; j++) { //正序遍历数组元素
if(arr[j] > arr[j+1]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
//选择排序法1
void chooseSort(int arr[] , int length) {
int k , temp;
for(int i = 0; i < length-1; i++) { //正序遍历数组
k = i; //记录最小值的地址
for(int j = k+1; j < length; j++) { //遍历i以后的所有数组元素
if(arr[k] > arr[j]) {
k = j;
}
}
temp = arr[k];
arr[k] = arr[i];
arr[i] = temp;
}
}
//选择排序法2
void chooseSort2(int arr[] , int length) {
int k , temp;
for(int i = length-1; i > 0; i--) { //倒序序遍历数组
k = i; //记录最大值的地址
for(int j = k-1; j >= 0; j--) { //遍历i以后的所有数组元素
if(arr[k] < arr[j]) {
k = j;
}
}
temp = arr[k];
arr[k] = arr[i];
arr[i] = temp;
}
}
//插入排序法
void insertSort(int arr[] , int length) {
int temp , index = 0; //temp记录要插入的元素值,index记录要插入的位置
for(int i = 1; i < length; i++) { //遍历第二个及以后的所有元素
temp = arr[i];
if(temp < arr[i-1]) { //如果当前元素值小于它前一个元素,直接检查下一个元素
continue;
}
for(int j = 0; j < i; j++) { //在i以前找出插入的位置
if(arr[j] <= temp) {
index = j;
break;
}
}
for(int k = i; k >= index; k--) { //移动插入位置到i的所有元素
arr[k] = arr[k-1];
}
arr[index] = temp; //插入元素到相应的位置
}
}
//插入排序法2
void insertSort2(int arr[] , int length) {
int temp , index = length-1; //temp记录要插入的元素值,index记录要插入的位置
for(int i = length-2; i >= 0; i--) { //遍历倒数第二个及以前的所有元素
temp = arr[i];
if(temp < arr[i+1]) { //如果当前元素值小于它后一个元素,直接检查下一个元素
continue;
}
for(int j = length-1; j > i; j--) { //在i以后找出插入的位置
if(arr[j] <= temp) {
index = j;
break;
}
}
for(int k = i+1; k <= index; k++) { //移动i+1到index的所有元素
arr[k-1] = arr[k];
}
arr[index] = temp; //插入元素到相应的位置
}
}
//快速排序
void fastSort(int arr[] , int low , int high) {
if(low < high) {
int i = low , j = high; //使用i,j遍历整个数组区域
int prvilot = arr[low]; //记录中间值
//将数组分为两个段,一个段所有值都小于另外一个段
while(j > i) {
while(j > i && arr[j] >= prvilot) {
j--;
}
if(j > i)
arr[i++] = arr[j];
while(j > i && arr[i] <= prvilot) {
i++;
}
if(j > i)
arr[j--] = arr[i];
}
arr[i] = prvilot; //将中间值插入到空缺的位置
//递归调用函数,对子段进行快速排序
fastSort(arr , low , i);
fastSort(arr , i+1 , high);
}
}
//合并两个有序数组
void merge(int a1[] , int a2[] , int low , int middle , int high) {
int i , j;
for(i = low , j = middle+1; low<=middle && j <= high; i++) {
if(a1[low] < a1[j]) {
a2[i] = a1[low++];
} else {
a2[i] = a1[j++];
}
}
for(;low <= middle; i++) {
a2[i] = a1[low++];
}
for(;j <= high; i++) {
a2[i] = a1[j++];
}
}
//归并排序
void mergeSort(int a1[] , int a2[] , int low , int high) {
int m , *temp;
if(low == high) {
a2[low] = a1[low];
} else {
temp = (int *)malloc((high - low + 1) * sizeof(int));
m = (high + low) / 2;
mergeSort(a1 , temp , low , m);
mergeSort(a1 , temp , m + 1 , high);
merge(temp , a2 , low , m, high);
free(temp);
}
}
// 堆排序
void heapSort(int arr[] , int len) {
maxHeapTree(arr , len);
while(len > 0) {
swapValue(arr , 0 , len - 1);
maxHeapNode(arr , 1 , --len);
}
}
// 把整棵树化成大顶堆
void maxHeapTree(int arr[] , int len) {
/* 在n个数组成的数组中
* 如果把数组看成一个棵树
* 则[n/2]+1到第n个都是叶子结点
* 只需将前n/2个结点为根结点的树化成大顶堆就行了
*/
for(int x = len/2; x >= 1; x--) {
maxHeapNode(arr , x , len);
cout << len/2 << "---";
displayArray(arr , 6);
}
}
// 把一个结点化成大顶堆
void maxHeapNode(int arr[] , int index , int len) {
// 注意数组下标问题
if(index > 0 && index <= len / 2) {
int largest = index - 1;
if(arr[2*index-1] > arr[largest]) {
largest = 2 * index - 1;
}
// 此个要注意2*index可能出现越界
if(2 * index < len && arr[2*index] > arr[largest]) {
largest = 2 * index;
}
if(largest != index - 1) {
swapValue(arr , index - 1 , largest);
maxHeapNode(arr , largest + 1 , len);
}
}
}
// 交换数组元素值
void swapValue(int arr[] , int x, int y) {
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
// 展示数组数据值
void displayArray(int arr[] , int length) {
for(int i = 0; i < length; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
分享到:
相关推荐
### 字符串排序方法 在JavaScript以及其他的编程语言中,字符串排序是一个常见的需求。无论是对字符串数组进行排序还是对特定的字符串内部字符进行排序,掌握正确的排序方法对于开发者来说至关重要。 #### 标题:...
为了优化和比较不同排序算法的效率,程序可能还包含了性能分析功能,如计时器来测量每种排序方法所需的时间,或者使用特定的性能指标如比较次数和交换次数。 总结来说,这个项目旨在培养编程者对基本数据结构、文件...
* 通用排序方法 * @param arr 需要排序的数组 * @param field 排序字段 值类型传null 单字段传string 多字段传数组[["field1", SortType], ["field2", SortType]] 可传属性名 方法名 * @param sortType 排序类型...
通过比较这些排序算法,我们可以看到,不同的排序方法在不同场景下有不同的优势。例如,快速排序通常在实际应用中表现最优,而归并排序则在稳定性方面有优势。在分析和实现这些排序算法时,还需要考虑数据的特性、...
在计算机科学领域,排序是一...理解并掌握这些排序方法对于编程和算法设计非常重要,能够帮助我们选择最适合特定问题的解决方案。在实际应用中,还需要考虑诸如内存限制、数据分布特点等因素,来决定选用哪种排序算法。
本资源包“各种排序方法汇总(含有源程序)”提供了多种经典的排序算法的源代码实现,包括堆排序、基数排序、快速排序、直接插入排序和直接选择排序。这些排序算法各有特点,适用于不同的场景,理解它们的原理和实现...
本项目名为"各种排序方法演示",显然旨在通过Java语言展示多种不同的排序算法。以下是这些排序算法的详细介绍: 1. **Bubble Sort(冒泡排序)** - `BubbleSortAlgorithm.java` 文件中实现的冒泡排序是一种简单的...
本文将深入探讨C语言中的排序方法,并提供相关的代码示例,帮助读者理解并掌握这些基本的编程技能。 一、选择排序(Selection Sort) 选择排序是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素...
考拉最近学习到有两种字符串的排序方法: 1.根据字符串的字典序排序。例如: “car” “carriage” “cats” “koala” 2.根据字符串的长度排序。例如: “car” “cats” “koala” “doggies” “carriage” 考拉...
**C语言排序方法详解及其优缺点** 在计算机科学中,排序是处理数据的重要步骤,它使得数据有序,便于检索和分析。C语言作为基础且强大的编程语言,提供了多种排序算法供程序员选择。以下是对几种常见C语言排序方法...
这些排序方法是计算机科学中的基础,对于理解和优化算法性能至关重要。 1. **冒泡排序**:冒泡排序是最简单的排序算法之一,通过重复遍历待排序的数列,比较相邻元素并根据需要交换它们的位置。这个过程会使得较大...
Java排序方法是编程中不可或缺的一部分,它涉及到一系列的算法,用于将数组或列表中的元素按照特定顺序排列。这里我们将深入探讨几种常见的排序方法,包括直接插入排序、希尔排序、冒泡排序、快速排序、直接选择排序...
本文将深入探讨Java中的各种排序方法以及它们的改良策略。首先,我们来看看几种基础的排序算法,然后讨论如何通过优化来提高这些算法的性能。 1. **冒泡排序**(Bubble Sort): 冒泡排序是最基础的排序算法之一,...
这里我们将详细讨论几种经典的排序方法,包括选择排序、直接插入排序和冒泡排序。 首先,我们来看选择排序。选择排序是一种简单直观的排序算法,它的基本思想是在每一轮遍历中找到剩余元素中的最小(或最大)值,...
面向对象排序方法是一种在编程中实现排序算法时采用的基于面向对象编程思想的技术。面向对象编程(OOP)的核心概念包括封装、继承、多态和抽象。在这篇讨论中,我们将深入探讨如何利用这些概念来设计和实现排序算法...
本篇将详细讲解三种常见的排序方法:冒泡排序、插入排序和选择排序。 **冒泡排序(Bubble Sort)** 冒泡排序是最基础的排序算法之一,它通过重复遍历数组,比较相邻元素并交换(如果需要)来实现排序。其工作原理...
【C语言常用排序方法】 在C语言中,排序是编程中常见的任务,涉及到各种不同的算法。以下是几种常见的排序方法: 1. **稳定排序与非稳定排序** - 稳定排序:例如直接插入排序、冒泡排序和归并排序。它们在处理...
几种常见的排序方法 1. 选择排序法基本思想: 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 2.插入排序(Insertion Sort)的基本思想是...
总结各类排序方法。排序问题一直是计算机技术研究的重要问题,排序算法的好坏直接影响程序的执行速度和辅助存储空间的占有量。此代码将详细分析常见的各种排序算法,并从时间复杂度、空间复杂度、适用情况等多个方面...
交换排序 选择排序 冒泡排序 插入排序