Skip to content

Instantly share code, notes, and snippets.

@nishidy
Last active April 8, 2022 01:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nishidy/773f0919ab638461cba5dbfdaa714a67 to your computer and use it in GitHub Desktop.
Save nishidy/773f0919ab638461cba5dbfdaa714a67 to your computer and use it in GitHub Desktop.
Quick sort in C++ with concise debug message (going from both lowest index and highest index toward the middle)
#include <iostream>
#include <string>
#include <utility>
using namespace std;
void ___m1(string* s, int lo, int hi){
cout << "Let's sort! [" << lo << "," << hi << "] ";
for(int i=0;i<lo;i++) cout << (*s)[i];
cout << "|";
for(int i=lo;i<=hi;i++) cout << (*s)[i];
cout << "|";
for(int i=hi+1;i<s->size();i++) cout << (*s)[i];
cout << endl;
}
void ___m2(string* s, int l, int r, string m){
cout << " " << m << " " << l << "," << r << " ";
for(int i=0;i<(l<r?l:r);i++) cout << (*s)[i];
cout << "[" << (*s)[(l<r?l:r)] << "]";
if(l==r){
for(int i=l+1;i<s->size();i++) cout << (*s)[i];
}else{
for(int i=(l<r?l:r)+1;i<(l<r?r:l);i++) cout << (*s)[i];
cout << "[" << (*s)[(l<r?r:l)] << "]";
for(int i=(l<r?r:l)+1;i<s->size();i++) cout << (*s)[i];
}
cout << endl;
}
void qs(string* s, int lo, int hi){
___m1(s,lo,hi);
int l=lo,r=hi,pi=lo; // pivot is the first one
string p=string(1,(*s)[pi]);
if(lo<hi){
while(l<r){
while(string(1,(*s)[l])<=p && l<hi) l++;
while(p<string(1,(*s)[r]) && lo<r) r--;
___m2(s,l,r,"BEFORE");
if(l<r){
swap((*s)[l],(*s)[r]);
___m2(s,l,r,"AFTER ");
}
}
___m2(s,pi,r,"BEFORE(p)");
swap((*s)[pi],(*s)[r]);
___m2(s,pi,r,"AFTER (p)");
qs(s,lo,r-1);
qs(s,r+1,hi);
}
}
int main(){
string s;
cin >> s;
qs(&s,0,s.size()-1);
cout << s << endl;
}
@nishidy
Copy link
Author

nishidy commented Apr 8, 2022

$ ./qs               
xyzcba
Let's sort! [0,5] |xyzcba|
  BEFORE 1,5 x[y]zcb[a]
  AFTER  1,5 x[a]zcb[y]
  BEFORE 2,4 xa[z]c[b]y
  AFTER  2,4 xa[b]c[z]y
  BEFORE 4,3 xab[c][z]y
  BEFORE(p) 0,3 [x]ab[c]zy
  AFTER (p) 0,3 [c]ab[x]zy
Let's sort! [0,2] |cab|xzy
  BEFORE 2,2 ca[b]xzy
  BEFORE(p) 0,2 [c]a[b]xzy
  AFTER (p) 0,2 [b]a[c]xzy
Let's sort! [0,1] |ba|cxzy
  BEFORE 1,1 b[a]cxzy
  BEFORE(p) 0,1 [b][a]cxzy
  AFTER (p) 0,1 [a][b]cxzy
Let's sort! [0,0] |a|bcxzy
Let's sort! [2,1] ab||cxzy
Let's sort! [3,2] abc||xzy
Let's sort! [4,5] abcx|zy|
  BEFORE 5,5 abcxz[y]
  BEFORE(p) 4,5 abcx[z][y]
  AFTER (p) 4,5 abcx[y][z]
Let's sort! [4,4] abcx|y|z
Let's sort! [6,5] abcxyz||
abcxyz
$ ./qs
abaabbaabbab
Let's sort! [0,11] |abaabbaabbab|
  BEFORE 1,10 a[b]aabbaabb[a]b
  AFTER  1,10 a[a]aabbaabb[b]b
  BEFORE 4,7 aaaa[b]ba[a]bbbb
  AFTER  4,7 aaaa[a]ba[b]bbbb
  BEFORE 5,6 aaaaa[b][a]bbbbb
  AFTER  5,6 aaaaa[a][b]bbbbb
  BEFORE 6,5 aaaaa[a][b]bbbbb
  BEFORE(p) 0,5 [a]aaaa[a]bbbbbb
  AFTER (p) 0,5 [a]aaaa[a]bbbbbb
Let's sort! [0,4] |aaaaa|abbbbbb
  BEFORE 4,4 aaaa[a]abbbbbb
  BEFORE(p) 0,4 [a]aaa[a]abbbbbb
  AFTER (p) 0,4 [a]aaa[a]abbbbbb
Let's sort! [0,3] |aaaa|aabbbbbb
  BEFORE 3,3 aaa[a]aabbbbbb
  BEFORE(p) 0,3 [a]aa[a]aabbbbbb
  AFTER (p) 0,3 [a]aa[a]aabbbbbb
Let's sort! [0,2] |aaa|aaabbbbbb
  BEFORE 2,2 aa[a]aaabbbbbb
  BEFORE(p) 0,2 [a]a[a]aaabbbbbb
  AFTER (p) 0,2 [a]a[a]aaabbbbbb
Let's sort! [0,1] |aa|aaaabbbbbb
  BEFORE 1,1 a[a]aaaabbbbbb
  BEFORE(p) 0,1 [a][a]aaaabbbbbb
  AFTER (p) 0,1 [a][a]aaaabbbbbb
Let's sort! [0,0] |a|aaaaabbbbbb
Let's sort! [2,1] aa||aaaabbbbbb
Let's sort! [3,2] aaa||aaabbbbbb
Let's sort! [4,3] aaaa||aabbbbbb
Let's sort! [5,4] aaaaa||abbbbbb
Let's sort! [6,11] aaaaaa|bbbbbb|
  BEFORE 11,11 aaaaaabbbbb[b]
  BEFORE(p) 6,11 aaaaaa[b]bbbb[b]
  AFTER (p) 6,11 aaaaaa[b]bbbb[b]
Let's sort! [6,10] aaaaaa|bbbbb|b
  BEFORE 10,10 aaaaaabbbb[b]b
  BEFORE(p) 6,10 aaaaaa[b]bbb[b]b
  AFTER (p) 6,10 aaaaaa[b]bbb[b]b
Let's sort! [6,9] aaaaaa|bbbb|bb
  BEFORE 9,9 aaaaaabbb[b]bb
  BEFORE(p) 6,9 aaaaaa[b]bb[b]bb
  AFTER (p) 6,9 aaaaaa[b]bb[b]bb
Let's sort! [6,8] aaaaaa|bbb|bbb
  BEFORE 8,8 aaaaaabb[b]bbb
  BEFORE(p) 6,8 aaaaaa[b]b[b]bbb
  AFTER (p) 6,8 aaaaaa[b]b[b]bbb
Let's sort! [6,7] aaaaaa|bb|bbbb
  BEFORE 7,7 aaaaaab[b]bbbb
  BEFORE(p) 6,7 aaaaaa[b][b]bbbb
  AFTER (p) 6,7 aaaaaa[b][b]bbbb
Let's sort! [6,6] aaaaaa|b|bbbbb
Let's sort! [8,7] aaaaaabb||bbbb
Let's sort! [9,8] aaaaaabbb||bbb
Let's sort! [10,9] aaaaaabbbb||bb
Let's sort! [11,10] aaaaaabbbbb||b
Let's sort! [12,11] aaaaaabbbbbb||
aaaaaabbbbbb
$ ./qs
abcdef
Let's sort! [0,5] |abcdef|
  BEFORE 1,0 [a][b]cdef
  BEFORE(p) 0,0 [a]bcdef
  AFTER (p) 0,0 [a]bcdef
Let's sort! [0,-1] ||abcdef
Let's sort! [1,5] a|bcdef|
  BEFORE 2,1 a[b][c]def
  BEFORE(p) 1,1 a[b]cdef
  AFTER (p) 1,1 a[b]cdef
Let's sort! [1,0] a||bcdef
Let's sort! [2,5] ab|cdef|
  BEFORE 3,2 ab[c][d]ef
  BEFORE(p) 2,2 ab[c]def
  AFTER (p) 2,2 ab[c]def
Let's sort! [2,1] ab||cdef
Let's sort! [3,5] abc|def|
  BEFORE 4,3 abc[d][e]f
  BEFORE(p) 3,3 abc[d]ef
  AFTER (p) 3,3 abc[d]ef
Let's sort! [3,2] abc||def
Let's sort! [4,5] abcd|ef|
  BEFORE 5,4 abcd[e][f]
  BEFORE(p) 4,4 abcd[e]f
  AFTER (p) 4,4 abcd[e]f
Let's sort! [4,3] abcd||ef
Let's sort! [5,5] abcde|f|
abcdef
$ ./qs
8376410295   
Let's sort! [0,9] |8376410295|
  BEFORE 8,9 83764102[9][5]
  AFTER  8,9 83764102[5][9]
  BEFORE 9,8 83764102[5][9]
  BEFORE(p) 0,8 [8]3764102[5]9
  AFTER (p) 0,8 [5]3764102[8]9
Let's sort! [0,7] |53764102|89
  BEFORE 2,7 53[7]6410[2]89
  AFTER  2,7 53[2]6410[7]89
  BEFORE 3,6 532[6]41[0]789
  AFTER  3,6 532[0]41[6]789
  BEFORE 6,5 53204[1][6]789
  BEFORE(p) 0,5 [5]3204[1]6789
  AFTER (p) 0,5 [1]3204[5]6789
Let's sort! [0,4] |13204|56789
  BEFORE 1,3 1[3]2[0]456789
  AFTER  1,3 1[0]2[3]456789
  BEFORE 2,1 1[0][2]3456789
  BEFORE(p) 0,1 [1][0]23456789
  AFTER (p) 0,1 [0][1]23456789
Let's sort! [0,0] |0|123456789
Let's sort! [2,4] 01|234|56789
  BEFORE 3,2 01[2][3]456789
  BEFORE(p) 2,2 01[2]3456789
  AFTER (p) 2,2 01[2]3456789
Let's sort! [2,1] 01||23456789
Let's sort! [3,4] 012|34|56789
  BEFORE 4,3 012[3][4]56789
  BEFORE(p) 3,3 012[3]456789
  AFTER (p) 3,3 012[3]456789
Let's sort! [3,2] 012||3456789
Let's sort! [4,4] 0123|4|56789
Let's sort! [6,7] 012345|67|89
  BEFORE 7,6 012345[6][7]89
  BEFORE(p) 6,6 012345[6]789
  AFTER (p) 6,6 012345[6]789
Let's sort! [6,5] 012345||6789
Let's sort! [7,7] 0123456|7|89
Let's sort! [9,9] 012345678|9|
0123456789

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment