自定义排序法第二版本

这是我自己想的排序方法的第二个版本

里面的原理就是数组中的每一个数,放到另一个数组中,并且是以要排序的数组的数字作为索引,再将第二个数组中的数字按照第二个数组的顺序依次放到第一个数组中。

代码


class Rule {

	class Node {// 节点
		Node head = null;//头结点

		Node next = null;//头节点的下一个节点

		public int value;//被存入的值

		public Node(int value) {
			this.value = value;
		}

		public Node() {
		}
	}

	public void sort(int[] arr) {
		int max = 0;//定义的数组最大值
		int min = 0;//定义的数组最小值
		int temp = 0;//替换值
		int j = arr.length - 1;
		for (int i = 0; i < arr.length - 1; i++) {//通过循环选出最大值最小值
			if (arr[i] > arr[i + 1]) {
				temp = arr[i + 1];
				arr[i + 1] = arr[i];
				arr[i] = temp;
			}
			max = arr[i + 1];
			if (arr[j] < arr[j - 1]) {
				temp = arr[j];
				arr[j] = arr[j - 1];
				arr[j - 1] = temp;
			}
			j--;
			min = arr[0];
		}

		Node[] node = new Node[max + 1];//创建第二个排序数组
		for (int i = 0; i < node.length; i++) {
			node[i] = new Node(-1);//给每一个数组里面的对象赋值
		}
		add(node, arr);//将第一个数组放到第二个数组中
		int y = 0;
		for (int i = 0; i < node.length; i++) {//将第二个数组的值放到第一个数组中
			if (node[i].head != null) {
				arr[y] = node[i].head.value;
				Node n = node[i].head.next;
				while (n != null) {//里面有相同的数会再次进行
					arr[++y] = n.value;
					n = n.next;
				}
				y++;
			}
		}
		System.out.println(Arrays.toString(arr));
	}

	public void add(Node[] node, int[] arr) {// 将数组的值转移至数组node里面,并且通过arr的值来排序
		for (int i = 0; i < arr.length; i++) {
			addNode(arr[i], node);
		}
	}

	public void addNode(int d, Node[] node) {
		Node newNode = new Node(d);// 实例化一个节点
		if (node[d].head == null) {
			node[d].head = newNode;//第一个数组中的值是存在数组的第一个节点中,不是存在数组的对象中
			return;
		}
		Node tmp = node[d].head;
		while (tmp.next != null) {//有相同的数字,会存在头节点的下一个节点
			tmp = tmp.next;
		}
		tmp.next = newNode;
	}

}

public class Demo03 {
	public static void main(String[] args) {
		int[] a = { 1, 2, 6, 15, 8, 6, 7, 1, 2, 1,1,15};
		Rule r = new Rule();
		r.sort(a);
		// System.out.println(r.head.next.next + "1234567");
	}

}

这个排序有很大的局限性,只能排数字,由于是由索引排序,所以只能排非负数,排负数会报错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值