没错,用一层循环搞定排序
package mainimport "fmt"func main() {slice := []int{2, 1, 9, 10, 7, 3, 6}sort(slice)fmt.Println(slice)
}func sort(slice []int) {for j, i, h := len(slice)-1, 0, 0; j > 0;{if slice[i] > slice[i+1] {slice[i] ^= slice[i+1]slice[i+1] ^= slice[i]slice[i] ^= slice[i+1]}i++if i == len(slice)-h-1 {j--h++i = 0}}
}
C语言版
#include "stdio.h"
int num[100000];int main()
{int index= 0;while (1){scanf("%d", &num[index]);if (num[index] ==-1) break;index++;}for (int j = index - 1, i = 0, h = 0; j > 0 ; i++, i == index - h - 1 ? j--, h++, i = 0 : 1 )num[i] > num[i + 1] ? num[i] ^= num[i + 1] ^= num[i] ^= num[i + 1] : 1;for (int i = 0; i <index; i++)printf("%d\t", num[i]);return 0;
}
C语言,类似计数排序的思想
#include "stdio.h"
int num[100000];
int main()
{while (1){int s = 0; scanf("%d", &s);if (s != -1) num[s] = 1;else break;}for (int i = 0; i < 100000; i++) if(num[i]!=0) printf("%d\t", i);return 0;
}
这种算法只是对冒泡排序进行了转换,也就是用变量传递的方式消除掉一层循环,其并不能提升冒泡排序O(N^2)复杂度的命运。