java随机数选择排序代码,如何选择最合适的排序算法?

1.排序算法分类

1.1 比较排序:

交换排序:基础冒泡排序、优化冒泡排序、基础快速排序、递归版优化快速排序、循环版优化快速排序

插入排序:基础插入排序、希尔优化插入排序

选择排序:选择排序、二叉堆排序、多叉堆排序

归并排序:归并排序

1.2 非比较排序:

计数排序

桶排序

基数排序

2.基础概念解读

2.1 时间复杂度

随着排序数据总量n的变大,排序总耗时的上升情况。有五个符号来表示不同的意思:

O(n^2) 大O 表示该排序算法增量情况 <= n^2

o(n^2) 小o 表示该排序算法增量情况 < n^2

θ(n^2) 希腊字母theta 表示该排序算法增量情况 == n^2

ω(n^2) 希腊字母小欧米伽 表示该排序算法增量情况 > n^2

Ω(n^2) 希腊字母大欧米伽 表示该排序算法增量情况 >= n^2

2.2 稳定性

如果a=b,排序前a在b之前,排序后a还在b之前,则稳定

如果a=b,排序前a在b之前,排序后a在b之后,则不稳定

2.3 逆序对

比如{2, 4, 3, 1}这样一个数列,就有{2, 1},{4, 3},{4, 1},{3, 1}等逆序对,数量为4

3.排序算法对比

bVblJSv?w=1787&h=788

4.代码实现(Java)

5.伪代码实现

5.1 基础冒泡排序

BasicBubbleSort(A)

for i=1 to A.length-1

for j=A.length down to i + 1

if A[j] < A[j-1]

exchange A[j] with A[j-1]

5.2 优化冒泡排序

OptimizeBubbleSort(A)

for i=1 to A.length-1

didSwap = false;

for j=A.length down to i + 1

if A[j] < A[j-1]

exchange A[j] with A[j-1]

didExchange = true

if didExchange == true

return

5.3 基础快速排序

BasicQuickSort(A, p, r)

if p < r

q = BasicPartition(A, p, r)

BasicQuickSort(A, p, q-1)

BasicQuickSort(A, q+1, r)

BasicPartition(A, p, r)

x = A[r]

i = p-1

for j=p to r-1

if A[j] <= x

i = i + 1

exchange A[i] with A[j]

exchange A[i+1] with A[r]

return i + 1

5.4 递归优化快速排序

RecuOptimizeQuickSort(A, sort, end)

if start < end

mid = RecuOptimizePartition(A, start, end)

RecuOptimizeQuickSort(A, start, mid-1)

RecuOptimizeQuickSort(A, start+1, end)

RecuOptimizePartition(A, start, end)

生成介于start和end之间的三个不重复的随机数r1,r2,r3

取A[r1],A[r2],A[r3]这三个数的中位数,并将该中位数的下标赋值给r0

x = A[r0]

i = start - 1

for j = start to end - 1

if A[j] <= x

i = i + 1

exchange A[i] with A[j]

exchange A[i+1] with A[end]

return i+1

5.5 循环优化快速排序

LoopOptimizeQuickSort(A)

stack = []

start = 0

end = A.length - 1

stack.push(start)

stack.push(end)

while stack.isNotEmpty()

end = stack.pop()

start = stack.pop()

if start < end

base = LoopOptimizePartition(A, start, end)

// 右半边

stack.push(base+1)

stack.push(end)

// 左半边

stack.push(start)

stack.push(base-1)

LoopOptimizePartition(A, start, end)

生成介于start和end之间的三个不重复的随机数r1,r2,r3

取A[r1],A[r2],A[r3]这三个数的中位数,并将该中位数的下标赋值给r0

x = A[r0]

i = start - 1

for j = start to end - 1

if A[j] <= x

i = i + 1

exchange A[i] with A[j]

exchange A[i+1] with A[end]

return i+1

5.6 基础插入排序

InsertionSort(A)

for j=2 to A.length

key = A[j]

i = j - 1

while i > 0 and A[i] > key

A[i+1] = A[i]

i = i - 1

A[i+1] = key

5.7 希尔优化插入排序

ShellInsertionSort(A)

increment = A.length

do {

increment = increment/3 + 1

for j = increment to A.length

key = A[j]

i = j - increment

while 0 <= i and A[i] > key

A[i+increment] = A[i]

i = i - increment

A[i+increment] = key

}while(1 < increment);

5.8 选择排序

SelectionSort(A)

for i=1 to n-1

min = i

for j=i+1 to n

if A[min] > A[j]

min = j

exchange A[min] with A[i]

5.9 二叉堆排序

HeapSort(A)

BuildMaxHeap(A)

for i = A.length downto 2

exchange A[1] with A[i]

A.heap-size = A.heap-size - 1

MaxHeapify(A, 1)

BuildMaxHeap(A)

A.heap-size = A.length

for i = A.length/2 downto 1

MaxHeapify(A, i)

MaxHeapify(A, i)

l = LEFT(i)

r = RIGHT(i)

if l <= a.heap-size and A[l] > A[i]

largest = l

else largest = i

if r <= A.heap-size and A[r] > A[largest]

largest = r

if largest != i

exchange A[i] with A[largest]

MaxHeapify(A, largest)

LEFT(i)

return 2i

RIGHT(i)

return 2i+1

5.10 多叉堆排序

5.11 归并排序

MergeSort(A, p, r)

if p < r

q = (p+r)/2 (向下取整)

MergeSort(A, p, q)

MergeSort(A, q+1, r)

Merge(A, p, q, r)

Merge(A, p, q, r)

n1 = q - p + 1

n2 = r - q

let L[1..n1+1] and R[1..n2 + 1] be new arrays

for i = 1 to n1

L[i] = A[p + i - 1]

for j = 1 to n2

R[j] = A[q + j]

L[n1+1] = 正无穷大

R[n2+1] = 正无穷大

i = 1

j = 1

for k = p to r

if L[i] <= R[j]

A[k] = L[i]

i = i + 1

else

A[k] = R[j]

j = j + 1

5.12 计数排序

CountingSort(A, B, k)

let C[0...k] be a new array

for i = 0 to k

C[i] = 0

for j = 1 to A.length

C[A[j]] = C[A[j]] + 1

for i = 1 to k

C[i] = C[i] + C[i-1]

for j = A.length downto 1

B[C[A[j]]] = A[j]

C[A[j]] = C[A[j]] - 1

https://www.cnblogs.com/zer0Black/p/6169858.html

BucketSort(A)

n = A.length

let B[0.. n-1] be a new array

for i = 0 to n-1

make B[i] an empty list

for i = 1 to n

insert A[i] into list B[]

for i = 0 to n-1

sort list B[i] with insertion sort

concatenate the lists B[0],B[1],...,B[n-1] together in order

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Java使用归并排序对随机进行去重和排序的示例代码: ```java import java.util.Arrays; public class MergeSort { public static void main(String[] args) { int[] nums = {5,3, 8, 6, 2, 7, 1, 4}; System.out.println("排序前:" + Arrays.toString(nums)); mergeSort(nums, 0, nums.length - 1); System.out.println("排序后:" + Arrays.toString(nums)); } public static void mergeSort(int[] nums, int left, int right) { if (left < right) { int mid = (left + right) / 2; mergeSort(nums, left, mid); mergeSort(nums, mid + 1, right); merge(nums, left, mid, right); } } public static void merge(int[] nums, int left, int mid, int right) { int[] temp = new int[right - left + 1]; int i = left, j = mid + 1, k = 0; while (i <= mid && j <= right) { if (nums[i] < nums[j]) { temp[k++] = nums[i++]; } else if (nums[i] > nums[j]) { temp[k++] = nums[j++]; } else { j++; } } while (i <= mid) { temp[k++] = nums[i++]; } while (j <= right) { temp[k++] = nums[j++]; } for (int p = 0; p < temp.length; p++) { nums[left + p] = temp[p]; } } } ``` 该示例代码中,我们使用了归并排序算法随机数进行排序,并在排序过程中去重。具体实现过程如下: 1. 首先定义一个`mergeSort`方法,该方法接收一个整型数组`nums`、一个整数`left`和一个整数`right`作为参数,表示对`nums`数组中从下标`left`到下标`right`的元素进行排序。 2. 在`mergeSort`方法中,我们首先判断`left`是否小于`right`,如果是,则继续执行排序操作;否则,直接返回。 3. 接着,我们计算出数组中间位置的下标`mid`,并分别对左半部分和右半部分进行递归排序。 4. 最后,我们调用`merge`方法对左右两个有序数组进行合并,从而得到最终的有序数组。 5. 在`merge`方法中,我们首先定义一个临时数组`temp`,用于存储合并后的有序数组。 6. 然后,我们使用两个指针`i`和`j`分别指向左右两个有序数组的起始位置,使用另一个指针`k`指向`temp`数组的起始位置。 7. 接着,我们比较`nums[i]`和`nums[j]`的大小关系,如果`nums[i]`小于`nums[j]`,则将`nums[i]`存入`temp[k]`中,并将`i`和`k`分别加1;如果`nums[i]`大于`nums[j]`,则将`nums[j]`存入`temp[k]`中,并将`j`和`k`分别加1;如果`nums[i]`等于`nums[j]`,则将`nums[j]`舍弃,并将`j`加1。 8. 最后,我们将剩余的元素依次存入`temp`数组中,并将`temp`数组中的元素复制回`nums`数组中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值