Data update
This commit is contained in:
parent
4bb20c9b71
commit
cbaf4c4b64
12390 changed files with 318560 additions and 27248 deletions
|
|
@ -0,0 +1,7 @@
|
|||
generic
|
||||
type Element_Type is digits <>;
|
||||
type Index_Type is (<>);
|
||||
type Array_Type is array(Index_Type range <>) of Element_Type;
|
||||
package Shell_Sort is
|
||||
procedure Sort(Item : in out Array_Type);
|
||||
end Shell_Sort;
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
package body Shell_Sort is
|
||||
|
||||
----------
|
||||
-- Sort --
|
||||
----------
|
||||
|
||||
procedure Sort (Item : in out Array_Type) is
|
||||
Increment : Natural := Index_Type'Pos(Item'Last) / 2;
|
||||
J : Index_Type;
|
||||
Temp : Element_Type;
|
||||
begin
|
||||
while Increment > 0 loop
|
||||
for I in Index_Type'Val(Increment) .. Item'Last loop
|
||||
J := I;
|
||||
Temp := Item(I);
|
||||
while J > Index_Type'val(Increment) and then Item (Index_Type'Val(Index_Type'Pos(J) - Increment)) > Temp loop
|
||||
Item(J) := Item (Index_Type'Val(Index_Type'Pos(J) - Increment));
|
||||
J := Index_Type'Val(Index_Type'Pos(J) - Increment);
|
||||
end loop;
|
||||
Item(J) := Temp;
|
||||
end loop;
|
||||
if Increment = 2 then
|
||||
Increment := 1;
|
||||
else
|
||||
Increment := Increment * 5 / 11;
|
||||
end if;
|
||||
end loop;
|
||||
end Sort;
|
||||
|
||||
end Shell_Sort;
|
||||
|
|
@ -0,0 +1,100 @@
|
|||
*******************************************************
|
||||
IDENTIFICATION DIVISION.
|
||||
*******************************************************
|
||||
PROGRAM-ID. SHELLSRT.
|
||||
************************************************************
|
||||
*** SHELLSORT ****
|
||||
************************************************************
|
||||
ENVIRONMENT DIVISION.
|
||||
DATA DIVISION.
|
||||
WORKING-STORAGE SECTION.
|
||||
01 II PIC S9(008) COMP-5.
|
||||
01 IJ PIC S9(008) COMP-5.
|
||||
01 IZ PIC S9(008) COMP-5.
|
||||
01 IA PIC S9(008) COMP-5.
|
||||
01 STRT1 PIC S9(008) COMP-5.
|
||||
01 STRT2 PIC S9(008) COMP-5.
|
||||
01 LGT PIC S9(008) COMP-5.
|
||||
01 ORG PIC S9(008) COMP-5.
|
||||
01 DST PIC S9(008) COMP-5.
|
||||
*
|
||||
01 GAP PIC S9(008) COMP-5.
|
||||
01 NEGAP PIC S9(008) COMP-5.
|
||||
01 TEMP PIC X(32768).
|
||||
77 KEY-RESULT PIC X.
|
||||
*
|
||||
LINKAGE SECTION.
|
||||
01 SRT-ARRAY PIC X(1000000).
|
||||
01 NUM-ITEM PIC 9(008) COMP-5.
|
||||
01 SRT-DATA.
|
||||
03 LGT-ITEM PIC 9(004) COMP-5.
|
||||
03 SRT-KEYS.
|
||||
05 SRT-KEY OCCURS 10.
|
||||
07 K-START PIC S9(004) COMP-5.
|
||||
07 K-LENGTH PIC S9(004) COMP-5.
|
||||
07 K-ASC PIC X.
|
||||
*
|
||||
* P R O C E D U R E D I V I S I O N
|
||||
*
|
||||
PROCEDURE DIVISION USING SRT-ARRAY NUM-ITEM SRT-DATA.
|
||||
|
||||
COMPUTE GAP = NUM-ITEM / 2.
|
||||
PERFORM UNTIL GAP < 1
|
||||
COMPUTE NEGAP = GAP * -1
|
||||
PERFORM VARYING II FROM GAP BY 1
|
||||
UNTIL II GREATER NUM-ITEM
|
||||
MOVE ' ' TO KEY-RESULT
|
||||
COMPUTE ORG = (II - 1) * LGT-ITEM + 1
|
||||
MOVE SRT-ARRAY(ORG:LGT-ITEM) TO TEMP(1:LGT-ITEM)
|
||||
PERFORM VARYING IJ FROM II BY NEGAP
|
||||
UNTIL IJ NOT GREATER GAP
|
||||
OR (KEY-RESULT NOT EQUAL '<' AND ' ')
|
||||
COMPUTE IA = IJ - GAP
|
||||
IF IA < 1
|
||||
MOVE 1 TO IA
|
||||
END-IF
|
||||
PERFORM COMPARE-KEYS
|
||||
IF KEY-RESULT = '<'
|
||||
COMPUTE ORG = (IA - 1) * LGT-ITEM + 1
|
||||
COMPUTE DST = (IJ - 1) * LGT-ITEM + 1
|
||||
MOVE SRT-ARRAY(ORG:LGT-ITEM)
|
||||
TO SRT-ARRAY(DST:LGT-ITEM)
|
||||
COMPUTE DST = (IA - 1) * LGT-ITEM + 1
|
||||
MOVE TEMP(1:LGT-ITEM) TO SRT-ARRAY(DST:LGT-ITEM)
|
||||
END-IF
|
||||
END-PERFORM
|
||||
END-PERFORM
|
||||
IF GAP = 2
|
||||
MOVE 1 TO GAP
|
||||
ELSE
|
||||
COMPUTE GAP = GAP / 2.2
|
||||
END-IF
|
||||
END-PERFORM.
|
||||
GOBACK.
|
||||
*
|
||||
COMPARE-KEYS.
|
||||
MOVE ' ' TO KEY-RESULT
|
||||
PERFORM VARYING IZ FROM 1 BY 1
|
||||
UNTIL IZ GREATER 10
|
||||
OR (KEY-RESULT NOT EQUAL '=' AND ' ')
|
||||
IF SRT-KEY(IZ) GREATER LOW-VALUES
|
||||
COMPUTE STRT1 = (IJ - 1) * LGT-ITEM + K-START(IZ)
|
||||
COMPUTE STRT2 = (IA - 1) * LGT-ITEM + K-START(IZ)
|
||||
MOVE K-LENGTH(IZ) TO LGT
|
||||
IF SRT-ARRAY(STRT1:LGT) > SRT-ARRAY(STRT2:LGT) AND
|
||||
K-ASC(IZ) EQUAL 'A'
|
||||
OR SRT-ARRAY(STRT1:LGT) < SRT-ARRAY(STRT2:LGT) AND
|
||||
K-ASC(IZ) EQUAL 'D'
|
||||
MOVE '>' TO KEY-RESULT
|
||||
END-IF
|
||||
IF SRT-ARRAY(STRT1:LGT) < SRT-ARRAY(STRT2:LGT) AND
|
||||
K-ASC(IZ) EQUAL 'A'
|
||||
OR SRT-ARRAY(STRT1:LGT) > SRT-ARRAY(STRT2:LGT) AND
|
||||
K-ASC(IZ) EQUAL 'D'
|
||||
MOVE '<' TO KEY-RESULT
|
||||
END-IF
|
||||
END-IF
|
||||
END-PERFORM.
|
||||
IF KEY-RESULT = ' '
|
||||
MOVE '=' TO KEY-RESULT
|
||||
END-IF.
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
C-PROCESS SECTION.
|
||||
C-000.
|
||||
DISPLAY "SORT STARTING".
|
||||
|
||||
DIVIDE WC-SIZE BY 2 GIVING WC-GAP.
|
||||
|
||||
PERFORM E-PROCESS-GAP UNTIL WC-GAP = 0.
|
||||
|
||||
DISPLAY "SORT FINISHED".
|
||||
|
||||
C-999.
|
||||
EXIT.
|
||||
|
||||
|
||||
E-PROCESS-GAP SECTION.
|
||||
E-000.
|
||||
PERFORM F-SELECTION VARYING WB-IX-1 FROM WC-GAP BY 1
|
||||
UNTIL WB-IX-1 > WC-SIZE.
|
||||
|
||||
DIVIDE WC-GAP BY 2.2 GIVING WC-GAP.
|
||||
|
||||
E-999.
|
||||
EXIT.
|
||||
|
||||
F-SELECTION SECTION.
|
||||
F-000.
|
||||
SET WB-IX-2 TO WB-IX-1.
|
||||
MOVE WB-ENTRY(WB-IX-1) TO WC-TEMP.
|
||||
|
||||
SET WB-IX-3 TO WB-IX-2.
|
||||
SET WB-IX-3 DOWN BY WC-GAP.
|
||||
PERFORM G-PASS UNTIL WB-IX-2 NOT > WC-GAP
|
||||
* The next line logically reads :
|
||||
* or wb-entry(wb-ix-2 - wc-gap) not > wc-temp.
|
||||
OR WB-ENTRY(WB-IX-3) NOT > WC-TEMP.
|
||||
|
||||
IF WB-IX-1 NOT = WB-IX-2
|
||||
MOVE WC-TEMP TO WB-ENTRY(WB-IX-2).
|
||||
|
||||
F-999.
|
||||
EXIT.
|
||||
|
||||
G-PASS SECTION.
|
||||
* Note that WB-IX-3 is WC-GAP less than WB-IX-2.
|
||||
* Logically this should be :
|
||||
* move wb-entry(wb-ix-2 - wc-gap) to wb-entry(wb-ix-2).
|
||||
* set wb-ix-2 down by wc-gap.
|
||||
* Unfortunately wb-entry(wb-ix-2 - wc-gap) is not legal in C2 cobol
|
||||
G-000.
|
||||
MOVE WB-ENTRY(WB-IX-3) TO WB-ENTRY(WB-IX-2).
|
||||
SET WB-IX-2 DOWN BY WC-GAP.
|
||||
SET WB-IX-3 DOWN BY WC-GAP.
|
||||
|
||||
G-999.
|
||||
EXIT.
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
function shell_sort(sequence s)
|
||||
integer gap,j
|
||||
object temp
|
||||
gap = floor(length(s)/2)
|
||||
while gap > 0 do
|
||||
for i = gap to length(s) do
|
||||
temp = s[i]
|
||||
j=i-gap
|
||||
while j >= 1 and compare(temp, s[j]) <= 0 do
|
||||
s[j+gap]=s[j]
|
||||
j -= gap
|
||||
end while
|
||||
s[j+gap] = temp
|
||||
end for
|
||||
gap = floor(gap/2)
|
||||
end while
|
||||
return s
|
||||
end function
|
||||
|
||||
constant s = rand(repeat(1000,10))
|
||||
puts(1,"Before: ")
|
||||
? s
|
||||
puts(1,"After: ")
|
||||
? shell_sort(s)
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
class ShellSort {
|
||||
@:generic
|
||||
public static function sort<T>(arr:Array<T>) {
|
||||
var h = arr.length;
|
||||
while (h > 0) {
|
||||
h >>= 1;
|
||||
for (i in h...arr.length) {
|
||||
var k = arr[i];
|
||||
var j = i;
|
||||
while (j >= h && Reflect.compare(k, arr[j - h]) < 0) {
|
||||
arr[j] = arr[j - h];
|
||||
j -= h;
|
||||
}
|
||||
arr[j] = k;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class Main {
|
||||
static function main() {
|
||||
var integerArray = [1, 10, 2, 5, -1, 5, -19, 4, 23, 0];
|
||||
var floatArray = [1.0, -3.2, 5.2, 10.8, -5.7, 7.3,
|
||||
3.5, 0.0, -4.1, -9.5];
|
||||
var stringArray = ['We', 'hold', 'these', 'truths', 'to',
|
||||
'be', 'self-evident', 'that', 'all',
|
||||
'men', 'are', 'created', 'equal'];
|
||||
Sys.println('Unsorted Integers: ' + integerArray);
|
||||
ShellSort.sort(integerArray);
|
||||
Sys.println('Sorted Integers: ' + integerArray);
|
||||
Sys.println('Unsorted Floats: ' + floatArray);
|
||||
ShellSort.sort(floatArray);
|
||||
Sys.println('Sorted Floats: ' + floatArray);
|
||||
Sys.println('Unsorted Strings: ' + stringArray);
|
||||
ShellSort.sort(stringArray);
|
||||
Sys.println('Sorted Strings: ' + stringArray);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
local fmt = require "fmt"
|
||||
|
||||
local function shell_sort(a)
|
||||
local n = #a
|
||||
local gaps = {701, 301, 132, 57, 23, 10, 4, 1}
|
||||
for gaps as gap do
|
||||
if gap < n then
|
||||
for i = gap + 1, n do
|
||||
local t = a[i]
|
||||
local j = i
|
||||
while j > gap and a[j - gap] > t do
|
||||
a[j] = a[j - gap]
|
||||
j -= gap
|
||||
end
|
||||
a[j] = t
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local array = { {4, 65, 2, -31, 0, 99, 2, 83, 782, 1}, {7, 5, 2, 6, 1, 4, 2, 6, 3} }
|
||||
for array as a do
|
||||
fmt.print("Before: %,s", a)
|
||||
shell_sort(a)
|
||||
fmt.print("After : %,s", a)
|
||||
print()
|
||||
end
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
Function ShellSort( [Array] $data )
|
||||
{
|
||||
# http://oeis.org/A108870
|
||||
$A108870 = [Int64[]] ( 1, 4, 9, 20, 46, 103, 233, 525, 1182, 2660, 5985, 13467, 30301, 68178, 153401, 345152, 776591, 1747331, 3931496, 8845866, 19903198, 44782196, 100759940, 226709866, 510097200, 1147718700, 2582367076, 5810325920, 13073233321, 29414774973 )
|
||||
$datal = $data.length - 1
|
||||
$inci = [Array]::BinarySearch( $A108870, [Int64] ( [Math]::Floor( $datal / 2 ) ) )
|
||||
if( $inci -lt 0 )
|
||||
{
|
||||
$inci = ( $inci -bxor -1 ) - 1
|
||||
}
|
||||
$A108870[ $inci..0 ] | ForEach-Object {
|
||||
$inc = $_
|
||||
$_..$datal | ForEach-Object {
|
||||
$temp = $data[ $_ ]
|
||||
$j = $_
|
||||
for( ; ( $j -ge $inc ) -and ( $data[ $j - $inc ] -gt $temp ); $j -= $inc )
|
||||
{
|
||||
$data[ $j ] = $data[ $j - $inc ]
|
||||
}
|
||||
$data[ $j ] = $temp
|
||||
}
|
||||
}
|
||||
$data
|
||||
}
|
||||
|
||||
$l = 10000; ShellSort( ( 1..$l | ForEach-Object { $Rand = New-Object Random }{ $Rand.Next( 0, $l - 1 ) } ) )
|
||||
|
|
@ -0,0 +1,188 @@
|
|||
# riscv assembly raspberry pico2 rp2350
|
||||
# program shellsort.s
|
||||
# connexion putty com3
|
||||
/*********************************************/
|
||||
/* CONSTANTES */
|
||||
/********************************************/
|
||||
/* for this file see risc-v task include a file */
|
||||
.include "../../../constantesRiscv.inc"
|
||||
|
||||
/*******************************************/
|
||||
/* INITIALED DATAS */
|
||||
/*******************************************/
|
||||
.data
|
||||
szMessStart: .asciz "Program riscv start.\r\n"
|
||||
szMessEnd: .asciz "\nProgram end OK.\r\n"
|
||||
szCariageReturn: .asciz "\r\n"
|
||||
|
||||
szMessSortOk: .asciz "Area sorted.\n"
|
||||
szMessSortNok: .asciz "Area not sorted !!!!!.\n"
|
||||
szLibSort: .asciz "\nAfter sort\n"
|
||||
szSpace: .asciz " "
|
||||
|
||||
.align 2
|
||||
tabNumber: .int 5,7,8,3,2,9,1,4,6
|
||||
.equ NBTABNUMBER1, . - tabNumber
|
||||
.equ NBTABNUMBER, NBTABNUMBER1 / 4 # compute items number
|
||||
|
||||
/*******************************************/
|
||||
/* UNINITIALED DATA */
|
||||
/*******************************************/
|
||||
.bss
|
||||
.align 2
|
||||
sConvArea: .skip 24
|
||||
|
||||
/**********************************************/
|
||||
/* SECTION CODE */
|
||||
/**********************************************/
|
||||
.text
|
||||
.global main
|
||||
|
||||
main:
|
||||
call stdio_init_all # général init
|
||||
1: # start loop connexion
|
||||
li a0,0 # raz argument register
|
||||
call tud_cdc_n_connected # waiting for USB connection
|
||||
beqz a0,1b # return code = zero ?
|
||||
|
||||
la a0,szMessStart # message address
|
||||
call writeString # display message
|
||||
|
||||
la s0,tabNumber # number array address
|
||||
li s1,0
|
||||
li s2,NBTABNUMBER
|
||||
2: # item loop
|
||||
sh2add t3,s1,s0 # compute item address
|
||||
lw a0,(t3)
|
||||
call displayResultD
|
||||
add s1,s1,1
|
||||
blt s1,s2,2b
|
||||
la a0,szCariageReturn
|
||||
call writeString
|
||||
mv a0,s0 # number array address
|
||||
li a1,0 # first item
|
||||
addi a2,s2,-1 # last item
|
||||
call shellSort # sort
|
||||
mv a0,s0 # number array address
|
||||
li a1,0 # first item
|
||||
addi a2,s2,-1 # last item
|
||||
call isSorted
|
||||
|
||||
la a0,szLibSort
|
||||
call writeString
|
||||
|
||||
li s1,0
|
||||
3: # item loop
|
||||
sh2add t3,s1,s0 # compute item address
|
||||
lw a0,(t3)
|
||||
call displayResultD
|
||||
add s1,s1,1
|
||||
blt s1,s2,3b
|
||||
la a0,szCariageReturn
|
||||
call writeString
|
||||
la a0,szMessEnd
|
||||
call writeString
|
||||
call getchar
|
||||
100: # final loop
|
||||
j 100b
|
||||
/**********************************************/
|
||||
/* display Result décimal */
|
||||
/**********************************************/
|
||||
/* a0 value */
|
||||
.equ LGZONECONV, 20
|
||||
displayResultD:
|
||||
addi sp, sp, -4 # reserve stack
|
||||
sw ra, 0(sp)
|
||||
la a1,sConvArea # conversion result address
|
||||
call conversion10 # binary conversion
|
||||
la a0,sConvArea # message address
|
||||
call writeString # display message
|
||||
la a0,szSpace
|
||||
call writeString
|
||||
100:
|
||||
lw ra, 0(sp)
|
||||
addi sp, sp, 4
|
||||
ret
|
||||
|
||||
/**********************************************/
|
||||
/* */
|
||||
/**********************************************/
|
||||
/* a0 area address */
|
||||
/* a1 first element */
|
||||
/* a2 last element */
|
||||
.equ LGZONECONV, 20
|
||||
isSorted:
|
||||
addi sp, sp, -4 # reserve stack
|
||||
sw ra, 0(sp)
|
||||
mv t0,a1
|
||||
sh2add t1,t0,a0
|
||||
lw t2,(t1) # load first element
|
||||
1:
|
||||
addi t0,t0,1
|
||||
ble t0,a2,2f # end indice ?
|
||||
la a0,szMessSortOk
|
||||
call writeString
|
||||
li a0,1 # yes -> area is sorted
|
||||
j 100f
|
||||
2:
|
||||
sh2add t1,t0,a0
|
||||
lw t3,(t1) # load next element
|
||||
bge t3,t2,3f # >= ?
|
||||
la a0,szMessSortNok
|
||||
call writeString
|
||||
li a0,0 # no -> area is not sorted
|
||||
j 100f
|
||||
3:
|
||||
mv t2,t3
|
||||
j 1b
|
||||
100:
|
||||
lw ra, 0(sp)
|
||||
addi sp, sp, 4
|
||||
ret
|
||||
|
||||
/******************************************************************/
|
||||
/* shell sort */
|
||||
/******************************************************************/
|
||||
/* a0 contains array address */
|
||||
/* a1 contains the first element */
|
||||
/* a2 contains the last element */
|
||||
shellSort:
|
||||
addi sp, sp, -4 # reserve stack
|
||||
sw ra, 0(sp) # save registers
|
||||
sub t0,a2,a1 # init gap
|
||||
addi t0,t0,1
|
||||
1: # start loop 1
|
||||
srli t0,t0,1 # gap = gap / 2
|
||||
beqz t0,100f # if gap = 0 -> end
|
||||
mv t3,t0 # init indice loop 1
|
||||
add t3,t3,a1 # add first indice
|
||||
2: # start loop 2
|
||||
sh2add t2,t3,a0
|
||||
lw t4,(t2) # load value A[i]
|
||||
mv t5,t3 # index j
|
||||
3: # start loop 3
|
||||
sub t1,t5,a1 # - first indice
|
||||
blt t1,t0,4f # indice < gap
|
||||
sub t6,t5,t0 # index = indice - gap
|
||||
sh2add t2,t6,a0
|
||||
lw t6,(t2) # load value A[j]
|
||||
bge t4,t6,4f # compare value A[i] and A[j]
|
||||
sh2add t2,t5,a0
|
||||
sw t6,(t2) # store value A[j+1]
|
||||
sub t5,t5,t0 # index = indice - gap
|
||||
j 3b # and loop 3
|
||||
4:
|
||||
sh2add t2,t5,a0
|
||||
sw t4,(t2) # store value A[i] in A[j+1]
|
||||
addi t3,t3,1 # increment index i
|
||||
ble t3,a2,2b # end ? no -> loop 2
|
||||
j 1b # loop 1
|
||||
100:
|
||||
lw ra, 0(sp)
|
||||
addi sp, sp, 4
|
||||
ret
|
||||
/************************************/
|
||||
/* file include Fonctions */
|
||||
/***********************************/
|
||||
/* for this file see risc-v task include a file */
|
||||
.include "../../../includeFunctions.s"
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
fn shell(mut arr []int, n int) {
|
||||
mut j := 0
|
||||
for h := n; h /= 2; {
|
||||
for h := n; h > 0; h /= 2 {
|
||||
for i := h; i < n; i++ {
|
||||
t := arr[i]
|
||||
for j = i; j >= h && t < arr[j - h]; j -= h {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue