排序算法——数据结构

 

代码:

 1     public int[] sortArray(int[] nums) {
 2         if (nums.length == 0 || nums.length == 1)
 3             return nums;
 4         int n = nums.length;
 5         int i, j;
 6         for (i = 1; i < n; i++) {
 7             if (nums[i] < nums[i - 1]) {
 8                 int curr = nums[i];
 9                 for (j = i - 1; j >= 0 && curr < nums[j]; j--) {
10                     nums[j + 1] = nums[j];
11                 }
12                 nums[j + 1] = curr;
13             }
14         }
15         return nums;
16     }

 

代码:

 1 public int[] sortArray(int[] nums) {
 2         if (nums.length == 0 || nums.length == 1)
 3             return nums;
 4         int n = nums.length;
 5         int i, j;
 6         for (i = 1; i < n; i++) {
 7             int left = 0;
 8             int right = i;//右边界取不到
 9             int curr = nums[i];
10             while (left < right) {
11                 int mid = (left + right) / 2;
12                 if (nums[mid] > curr) {
13                     right = mid;
14                 } else {
15                     left = mid + 1;
16                 }
17             }
18             for (j = i - 1; j >= right; j--) {
19                 nums[j + 1] = nums[j];
20             }
21             nums[j + 1] = curr;
22         }
23         return nums;
24     }

 

 代码:(把插入排序的1变成dk)

 1     public int[] sortArray(int[] nums) {
 2         if (nums.length == 0 || nums.length == 1)
 3             return nums;
 4         int n = nums.length;
 5         int i, j, dk;
 6         for (dk = n / 2; dk >= 1; dk = dk / 2) {
 7             for (i = dk; i < n; i++) {
 8                 if (nums[i] < nums[i - dk]) {
 9                     int curr = nums[i];
10                     for (j = i - dk; j >= 0 && curr < nums[j]; j -= dk) {
11                         nums[j + dk] = nums[j];
12                     }
13                     nums[j + dk] = curr;
14                 }
15             }
16         }
17         return nums;
18     }

 

 代码:(和图示不一样,代码是冒泡最小)

 1     public int[] sortArray(int[] nums) {
 2         if (nums.length <= 1)
 3             return nums;
 4         for (int i = 0; i < nums.length; i++) {
 5             boolean flag = false;
 6             for (int j = nums.length - 1; j > i; j--) {
 7                 if (nums[j] < nums[j - 1]) {
 8                     flag = true;
 9                     int temp = nums[j];
10                     nums[j] = nums[j - 1];
11                     nums[j - 1] = temp;
12                 }
13             }
14             if (!flag)
15                 return nums;
16         }
17         return nums;
18     }

 

 代码:

 1     public int[] sortArray(int[] nums) {
 2         if (nums.length <= 1)
 3             return nums;
 4         qsort(nums, 0, nums.length - 1);
 5         return nums;
 6     }
 7 
 8     private void qsort(int[] nums, int leftIndex, int rightIndex) {
 9         if (rightIndex < leftIndex)
10             return;
11         int flag = nums[leftIndex];
12         int left = leftIndex, right = rightIndex;
13         while (left < right) {
14             while (right > left && nums[right] >= flag) {
15                 right--;
16             }
17             nums[left] = nums[right];
18             while (left < right && nums[left] <= flag) {
19                 left++;
20             }
21             nums[right] = nums[left];
22         }
23         nums[left] = flag;
24         qsort(nums, leftIndex, left - 1);
25         qsort(nums, right + 1, rightIndex);
26     }

 

 代码:

 1     public int[] sortArray(int[] nums) {
 2         if (nums.length <= 1)
 3             return nums;
 4         for (int i = 0; i < nums.length; i++) {
 5             int minIndex = i;
 6             int min = nums[i];
 7             for (int j = i + 1; j < nums.length; j++) {
 8                 if (nums[j] < min) {
 9                     minIndex = j;
10                     min = nums[j];
11                 }
12             }
13             if (minIndex != i) {
14                 nums[minIndex] = nums[i];
15                 nums[i] = min;
16             }
17         }
18         return nums;
19     }

 

 

 代码:

 1     public int[] sortArray(int[] nums) {
 2         if (nums.length <= 1)
 3             return nums;
 4         PriorityQueue<Integer> pq = new PriorityQueue<>();
 5         for (int num : nums) {
 6             pq.add(num);
 7         }
 8         for (int i = 0; i < nums.length; i++) {
 9             nums[i] = pq.poll();
10         }
11         return nums;
12     }

 

 代码:

 1     public int[] sortArray(int[] nums) {
 2         if (nums.length <= 1)
 3             return nums;
 4         mergeSort(nums, 0, nums.length - 1);
 5         return nums;
 6     }
 7 
 8     private void mergeSort(int[] nums, int left, int right) {
 9         if (left < right) {
10             int mid = (left + right) / 2;
11             mergeSort(nums, left, mid);
12             mergeSort(nums, mid + 1, right);
13             merge(nums, left, mid, right);
14         }
15     }
16 
17     private void merge(int[] nums, int left, int mid, int right) {
18         int[] temp = Arrays.copyOf(nums, nums.length);
19         int p1 = left, p2 = mid + 1, k = left;
20         while (p1 <= mid && p2 <= right) {
21             if (nums[p1] <= nums[p2])
22                 temp[k++] = nums[p1++];
23             else
24                 temp[k++] = nums[p2++];
25         }
26         while (p1 <= mid) {
27             temp[k++] = nums[p1++];
28         }
29         while (p2 <= right) {
30             temp[k++] = nums[p2++];
31         }
32         System.arraycopy(temp, 0, nums, 0, temp.length);
33     }

 

 动态基数排序

代码:(只用于正数)

 1     public int[] sortArray(int[] nums) {
 2         if (nums.length <= 1)
 3             return nums;
 4         int max = Integer.MIN_VALUE;
 5         for (Integer n : nums) {
 6             max = Math.max(max, n);
 7         }
 8         int bit = 0;
 9         while (max >= Math.pow(10, bit)) {
10             bit++;
11         }
12         for (int i = 0; i < bit; i++) {
13             ArrayList<ArrayList<Integer>> bucket = new ArrayList<>();
14             for (int j = 0; j < 10; j++) {
15                 bucket.add(new ArrayList<>());
16             }
17             for (Integer n : nums) {
18                 int a = (int) (n / Math.pow(10, i));
19                 int bitnum = a % 10;
20                 bucket.get(bitnum).add(n);
21             }
22             int k = 0;
23             for (ArrayList<Integer> num : bucket) {
24                 for (Integer n : num) {
25                     nums[k++] = n;
26                 }
27             }
28         }
29         return nums;
30     }

 

 

posted @ 2018-03-28 22:33  Shaw_喆宇  阅读(180)  评论(0编辑  收藏  举报