우리가 다이아몬드 (13 * 13 배열의 85 개 요소)이 말 모든 요소는 두 개의 매개 변수, 우리는 그래서 다이아몬드 정렬 할 필요가 A/B 있습니다다이아몬드
- 을 각 열에서 [a] 매개 변수가 증가합니다.
- [b] 매개 변수는 각 행에서 증가합니다.
은 우리가 얻고 싶은 것은 다음과 같이이다 :
(이 5 * 5 배열의 쉬운 13 개 요소입니다)합니다 (* 메모리에 정의되지 않은 부분이다) 원래:
* * 4/3 * *
* 1/3 2/3 4/5 *
1/2 3/1 2/5 3/6 2/7
* 2/3 1/2 5/2 *
* * 6/1 * *
정렬 :
* * 1/3 * *
* 1/2 2/3 2/5 *
1/2 2/3 4/5 3/6 2/7
* 3/1 5/2 4/3 *
* * 6/1 * *
내 알고리즘은 모든 값을 정렬하여 버블 링 한 다음 b 매개 변수에 따라 각 행을 정렬합니다. 이것은 꽤 잘되지만 동적 인 명령어는 80000 이상이 될 것입니다 (O [n^2]이어야합니다). 버블 정렬은 10 점 이상이 필요하기 때문에 MIPS에서 열심히 짜증납니다. 각 수표마다 (거품으로).
14000 미만의 동적 명령어를 줄이는 더 나은 알고리즘이 있는지 알고 싶습니다. BTW는 < = 15 레지스터와 < = 66 개의 정적 명령어 (66 줄의 코드) 만 사용합니다.
findnum: addi $27, $27, 4
lw $21, 0($27)
beq $21, $0, findnum # find the next nonzero number
bsort: lw $20, 0($25) # load first number
slt $12, $21, $20 # if second < first $12=1
bne $12, $15, back # $15 is constant 1
sw $21, 0($25)
sw $20, 0($27)
back: addi $25, $27, 0 # now second number is first number
bne $27, $26, findnum # $27 not the end then continue
loop: addi $25, $01, 24
addi $27, $25, 0 # reinitialize the number
addi $10, $10, 1 # i++
bne $10, $11, findnum # if i not equal to 85 jump back
이것은 내 코드의 핵심 부분입니다. $ 25 및 $ 27은 배열의 첫 번째 값의 주소로 초기화됩니다. $ 26은 마지막 값의 주소입니다.
고맙습니다.
실제로 내가 2D로 다시 1D를 전송하는 방법에 문제가 발생하고있다. 빠른 정렬 외에도 MIPS에서 구현하기가 정말 어렵습니다. MIPS는 짜증나! !!!!!!! 즉 거품 정렬을 사용해야한다는 것을 의미하며 더 나은 알고리즘을 생각해야합니다. – ToHellWithGeorgi
1D -> 2D : "다이아몬드 구조"에 대한 간격을 유지하기를 원하십니까? 아니면 값이 어느 행에 속하는 지 결정하는 방법이 불분명하기 때문입니까? - Quicksort : 자, 그게 아침 체육관이야 .- 어쩌면 CombSort는 더 빨리 맹목적으로 말다툼을한다. [https://en.wikipedia.org/wiki/Comb_sort](https://en.wikipedia.org/wiki/) Comb_sort) –
도움 주셔서 대단히 감사합니다. 여기서 분명히하기 위해, 저는 MIPS라는 어셈블리 환경에서이 프로젝트를하고 있습니다. MIPS는 매우 어리 석다. 위에서 보았 듯이 간단한 버블 정렬 (또는 빠른 정렬)을위한 수많은 코드를 작성해야한다. C에서이 배열을 정렬하는 많은 방법을 생각할 수 있지만 대부분은 MIPS에서 구현하기가 어렵습니다. 그래서이 프로젝트를 끝내기위한 더 명확한 알고리즘을 찾으려고 노력하고 있습니다. (이것은 MIPS에서 더 적은 단계를 의미합니다). BTW CombSort는 매우 흥미 롭습니다. 나는 그것을 시도 할 것이다. 감사! – ToHellWithGeorgi