package Sort;
import java.util.Scanner;
import java.util.Stack;;
public class TestSort {
//冒泡
//插入
//选择
//希尔
//快排
//堆排序
//归并
//冒泡O(n^2)
public void bubbleSort(int[] nums)
{
int n = nums.length;
for(int i =0;i < n - 1;i++)
{
for(int j = 1; j < n - i;j++)
{
if(nums[j] < nums[j-1])
{
int temp = nums[j];
nums[j] = nums[j-1];
nums[j-1] = temp;
}
}
}
}
//选择O(n^2)
public void selectSort(int[] nums)
{
int n = nums.length;
for(int i = 0; i < n-1; i++)
{
int minIndex = i;
for(int j = i+1; j < n;j++)
{
if(nums[j] < nums[minIndex]) minIndex = j;
}
if(minIndex != i)
{
int temp = nums[i];
nums[i] = nums[minIndex];
nums[minIndex] = temp;
}
}
}
//插入O(n^2)
public void insertSort(int[] nums)
{
int n = nums.length;
for(int i = 1; i < n;i++)
{
int num = nums[i];
int j = i-1;
for(; j >=0 && num < nums[j]; j--)
nums[j+1] = nums[j];
nums[j+1] = num;
}
}
//希尔(O(n^1.3))
public void shellSort(int[] nums)
{
int n = nums.length;
for(int d = n/2;d>=1;d/=2)
{
for(int i = d; i < n;i++)
{
int temp = nums[i];
int j = i-d;
for(;j>=0 && temp < nums[j];j-=d)
{
nums[j+d] = nums[j];
}
nums[j+d] = temp;
}
}
}
//快排(O(nlogn))
public void quickSort(int[] nums)
{
helper(0, nums.length-1, nums);
}
private void helper(int left, int right, int[] nums)
{
if(left >= right) return;
int mid = sort(left, right, nums);
helper(left, mid-1, nums);
helper(mid+1, right, nums);
}
private int sort(int left, int right, int[] nums)
{
int temp = nums[left];
while(left < right)
{
while(left < right && nums[right] >= temp){right--;}
if(left < right)nums[left] = nums[right];
while(left < right && nums[left] <= temp){left++;}
if(left < right){nums[right] = nums[left];}
}
nums[left] = temp;
return left;
}
//堆排序O(nlogn)
public void heapSort(int[] nums)
{
int n = nums.length;
for(int i = n/2;i>=1;i--)
{
shift(nums, i, n);
}
System.out.println(nums[0]);
for(int i = 1; i < n;i++)
{
int temp = nums[n-i];
nums[n-i] = nums[0];
nums[0] = temp;
shift(nums, 1, n-i);
}
}
private void shift(int[] nums,int k, int m)
{
int i = k,j = 2*i;
while(j <= m)
{
if(j<m && nums[j-1] < nums[j])j++;
if(nums[i-1] > nums[j-1])break;
else
{
int temp = nums[i-1];
nums[i-1] = nums[j-1];
nums[j-1] = temp;
i = j; j = 2*i;
}
}
}
//O(n)Membery mergeSort
public void mergeSort(int[] nums)
{
int n = nums.length;
helper(nums, 0, n-1);
}
private void helper(int[] nums1,int b, int e)
{
if(b < e)
{
int mid = (b + e) >> 1;
helper(nums1, b, mid);
helper(nums1, mid+1, e);
merge(nums1, b,mid,e);
}
}
void merge(int[] nums1,int b, int m,int e)
{
int[] nums2 = new int[nums1.length];
int i = b, j = m + 1, k = b;
while(i <= m && j <=e)
{
if(nums1[i] <= nums1[j]){nums2[k++] = nums1[i++];}
else nums2[k++] = nums1[j++];
}
while(i <= m){nums2[k++] = nums1[i++];}
while(j <= e){nums2[k++] = nums1[j++];}
for(int ii = b; ii <=e; ii++)
{
nums1[ii] = nums2[ii];
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TestSort t = new TestSort();
// Scanner s = new Scanner(System.in);
// int k = s.nextInt();
// for(int i = 0;i<k;i++)
// {
// String m = s.next();
// System.out.println(m);
// }
int[] nums = new int[]{3,3331,1114,1,3,15,6,1};
t.mergeSort(nums);
for(int n : nums){System.out.print(n+" ");}
// System.out.println();
// nums = new int[]{3,1,421,1,333333,5,6,1};
// t.insertSort(nums);
// for(int n : nums){System.out.print(n+" ");}
// System.out.println();
// nums = new int[]{3,1,4,1,3,5,6,1};
// t.selectSort(nums);
// for(int n : nums){System.out.print(n+" ");}
}
}
常见的排序算法
最新推荐文章于 2023-09-01 17:33:02 发布