列排序算法

It is amazing!列排序算法看起来很奇怪,但是它真的可以用来对所有数据排序,只不过需要有一些条件。

列排序算法是用于包含n个元素的矩形数组的排序,这个数组r行s列,满足下面三个条件:

1) r为偶数

2) s为r的因子

3) r大于等于2s2

这里就不去证明这个算法的正确性,证明见算法导论思考题8-7。感觉对于矩阵的问题,很多人第一反应会是 int a[M][N],或者使用int **a。

其实矩阵是一种数据表现形式,类似于最大最小堆,树结构一样,底层上并不是真正在对具象化的图形结构进行涂改(不像你在纸上画出来的结构),而是在一个连续的数组或者是零散的一些位置上执行操作,其效果就像是对上述的数据结构进行操作一样,是一种抽象。(轻喷 - -.) 所以这里用一个数组来表示矩阵发现代码很简洁,每一列是连续的,方便排序。

#include <iostream>
#include <algorithm>
using namespace std;

typedef size_t row;
typedef size_t column;

bool Check_Ok(row r, column s);
void Column_Sort(int *a, row r, column s);

void Column_Sort(int *a, row r, column s){
    //Check_Ok(r, s); 为了使用书上的例子,先不检查
    int n = r*s;
    int *p = new int[n];
    //step 1
    for (int i = 0; i < s; ++i)   { sort(a + i*r, a + i*r + r); }
    //step 2
    for (int i = 0; i < n; ++i)   { p[(i%s)*r + i / s] = a[i]; }
    //step 3
    for (int i = 0; i < s; ++i)   { sort(p + i*r, p + i*r + r); }
    //step 4
    for (int i = 0; i < n; ++i)   { a[(i%r)*s + i / r] = p[i]; }
    //step 5
    for (int i = 0; i < s; ++i)   { sort(a + i*r, a + i*r + r); }
    //step 6
    for (int i = 0; i < s - 1; ++i) { sort(a + i*r + r / 2, a + i*r + r + r / 2); }
}

bool Check_Ok(row r, column s){
    if (r % 2 == 1){
    cout << "rows must be an even" << endl;
    exit(0);
    }
    if (!(r%s == 0)){
        cout << "column error" << endl;
        exit(0);
    }
    if (r < 2 * s*s){
        cout << "s too big";
        exit(0);
    }
}

int main(){
    int a[18] = { 10, 8, 12, 16, 4, 18, 14, 7, 1, 9, 15, 3, 5, 17, 6, 11, 2, 13 };
    Column_Sort(a, 6, 3);
    for (auto r : a)
        cout << r<<" ";
}
时间: 2024-12-15 17:09:44

列排序算法的相关文章

C语言之基本算法42—矩阵转置及按行按列排序

//矩阵转置 按行按列排序 /* ================================================================== 题目:输入m*n矩阵,按行升序排列输出. 输入: 4 3 5 6 2 9 8 1 2 8 7 1 2 3 8 输出: 2 3 4 5 6 1 2 8 8 9 1 2 3 7 8 ================================================================== */ #includ

C言语拔出排序算法及代码

拔出排序是排序算法的一种,它不改动原有的序列(数组),而是创立一个新的序列,在新序列长进行操作.这里以从小到大排序为例停止解说. 根本思惟及举例阐明 拔出排序的根本思惟是,将元素逐一添加到曾经排序好的数组中去,同时请求,拔出的元素必需在准确的地位,如许本来排序好的数组是依然有序的.在实践运用中,平日是排序全部无序数组,所以把这个无序数组分为两局部排序好的子数组和待拔出的元素.第一轮时,将第一个元素作为排序好的子数组,拔出第二个元素:第二轮,将前两个元素作为排序好的数组,拔出第三个元素.以此类推,

8大排序算法图文讲解

排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等. 本文将依次介绍上述八大排序算法. 算法一:插入排序 插入排序示意图 插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法步骤: 1)将第一待排序序列第一

数据结构杂谈(一)浅谈基本排序算法

0.基本概念 记录:待排序的项目 关键词:决定排序结果 稳定性:相同关键词的记录保持原来的相对次序 1.1插入排序(Insertion Sort) 算法思想 一种简单直观的排序算法,工作原理是通过构建有序序列:对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法描述 具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排序的元素小于或者等于

C语言中的排序算法--冒泡排序,选择排序,希尔排序

冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端 维基百科:点击打开链接 [cpp] view plain copy /* 用选择法对10个数进行排序 */ #include<stdio.h> void main() { int i,j,

七大排序算法

排序算法效率比较 各种排序算法的比较 冒泡排序 基本定义 两两比较相邻记录的的关键字,如果反序则交换,直到没有反序的记录为止. 时间复杂度分析 最好的情况是,数组是有序的,只需要n - 1次的比较,时间复杂度是O(n) 最坏的情况是,数组是逆序的,需要比较 ∑i=2n(i?1)=1+2+3+...+(n?1)=n(n?1)2 , 所以时间复杂度为O(n2) 代码实现 void Bubble_sort(int arr[], int len) { bool flag = true; for(int

排序算法汇总总结_Java实现

一.插入排序 直接插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间. 代码实现: public class Inseretion_Sort {     public static void main(Stri

【Unity3D自学记录】可视化对照十多种排序算法(C#版)

在这篇文章中.我会向大家展示一些排序算法的可视化过程.我还写了一个工具.大家可对照查看某两种排序算法. 下载源代码 – 75.7 KB 下载演示样例 – 27.1 KB 引言 首先,我觉得是最重要的是要理解什么是"排序算法".依据维基百科.排序算法(Sorting algorithm)是一种能将一串数据按照特定排序方式进行排列的一种算法. 最经常使用到的排序方式是数值顺序以及字典顺序.有效的排序算法在一些算法(比如搜索算法与合并算法)中是重要的,如此这些算法才干得到正确解答.排序算法也

深入排序算法的多语言实现

深入浅出排序算法的多语言实现 作者:白宁超 2015年10月8日20:08:11 摘要:十一假期于实验室无趣,逐研究起数据结构之排序.起初觉得就那么几种排序,两三天就搞定了,后来随着研究的深入,发觉里面有不少东西.本文介绍常用的排序算法,主要从以下几个方面:算法的介绍.算法思想.算法步骤.算法优缺点.算法实现.运行结果.算法优化等.最后对本文进行总结.本文为作者原创,程序经测试无误.部分资料引用论文和网络材料以及博客,后续参见参考文献.(本文原创,转载注明出处) 1 排序的基本概念 排序: 所谓