您的位置:首页 > 其它

文章标题

2017-05-18 11:06 246 查看
public class Sort {

public static void swap(int[] array,int i,int j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}

public static  void insertSort(int[] arrayToSort){

for( int i = 0 ; i < arrayToSort.length; ++i){

//从i的位置往前去排 保证i前面的分片是有序的
for( int j = i-1 ; j >= 0 ; --j){
if( arrayToSort[j+1] < arrayToSort[j]){
swap(arrayToSort, j+1,j);
}
}
}
}

//选择排序
public static  void selectSort(int[] arrayToSort){

//每次选择arrayToSort[i] 后面最小的元素来进行交换
for( int i = 0 ; i < arrayToSort.length ; ++i){

int min = i;
for( int j = i+1; j < arrayToSort.length ; ++j){
if( arrayToSort[j] < arrayToSort[min]){
min = j;
}
}
swap(arrayToSort,min,i);
}
}

//归并排序 时间复杂度O(nlogn) 空间复杂度 O(n)+O(logn)
//可以将数组分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,
// 然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序

public static void mergerSort(int[] arrayToSort){
sort(arrayToSort,0,arrayToSort.length-1);
}

private  static void sort(int[] array ,int left,int  right) {

if (left < right) {
int center = (left + right) / 2;
//对左边递归
sort(array, left, center);

//对右边递归
sort(array, center + 1, right);

//mergerArray
mergerArray(array, left, center, right);

}
}

private static void mergerArray(int array[],int left,int mid,int right){

int[] tmp = new int[array.length];
int r1 = mid + 1;
int tIndex = left;       //tmp 数组索引
int sIndex = left;       //swap 时的索引
while (left <= mid && r1 <= right){
if(array[left] <= array[r1]){
tmp[tIndex++] = array[left++];
}else {
tmp[tIndex++] = array[r1++];
}
}
while (left <= mid){
tmp[tIndex++] = array[left++];
}

while (r1 <= right){
tmp[tIndex++] = array[r1++];
}
while (sIndex <= right){
array[sIndex] = tmp[sIndex++];
}
}
//快速排序的每一轮就是将这一轮的基准数归位,直到所有的数都归为为止,排序结束。(类似冒泡). partition是返回一个基准值的index, index 左边都小于该index的数,右边都大于该index的数。

public static void quickSort(int[] arrayToSort,int left ,int right){

int p ;
if( left < right){
p = parition(arrayToSort,left,right);
quickSort(arrayToSort,left,p-1); // 从[left,p-1]
quickSort(arrayToSort, p + 1,r
bbd8
ight);//从[p+1,right]
}

}

//三个指针 一个 是 i  从left开始 j 是从right开始 还有个基准变量
private static int parition(int[] array,int left,int right){

int povit = left;
int j = right;
int i = left;
int povitNum = array[povit];
while (i != j){
while (array[j] >= povitNum && i != j){
j--;
}
while ( array[i] <= povitNum && i != j){
i++;
}
if(i == j){
swap(array,povit,i);
}
swap(array,i,j);
}

return i;
}

public static int[] getMinKNumsByHeap(int[] arr,int k){

if(arr == null || k <= 0){
return null;
}
/*int[] heap = new int[k];
for(int i = 0  ; i < k; i++){
heapInsert(heap,arr[i],i);
}

for(int i = k ; i < arr.length;i++){
if(arr[i] < heap[0]){
heap[0] = arr[i];
heapify(heap,0,k);
}
}
return heap;
*/
int[] heap = creatHeap(arr,k);
for(int i = k ; i < arr.length ; ++i){
if(arr[i] > heap[0]){
insert(heap,arr[i]);
}
}
return  heap;
}

private static void heapInsert(int[] arr, int value, int index) {
arr[index] = value;
while (index != 0){
int parent = (index-1)/2;
if(arr[parent] <arr[index]){
swap(arr,index,parent);
index = parent;
}else {
break;
}
}
}

public static void heapify(int[] arr,int index,int heapsize){

int left = index * 2 + 1;
int right = index * 2 +2 ;
int largest = index;
while (left < heapsize){
if(arr[left] > arr[index]){
largest = left;
}
if(right < heapsize && arr[right] > arr[largest]){
largest = right;
}
if(largest != index){
swap(arr,largest,index);
}else {
break;
}
index = largest;
left = index * 2 + 1;
right = index * 2 + 2;
}
}

public static int[] creatHeap(int[] a,int k){
int[] result = new int[k];
for(int i = 0 ;i < k; ++i){
result[i] = a[i];
}

for(int i = 0 ; i < k; ++i){
int child = i;
int parent = (i -1)/2;
int temp = a[i];
while(parent >= 0 && child != 0 && result[parent] > temp){
result[child] = result[parent];
child = parent;
parent = (parent -1)/2;
}
result[child] = temp;
}
return result;
}

public static void insert(int[] a,int value){
a[0] = value;
int parent = 0;
while (parent < a.length){
int lchild = parent*2 + 1;
int rchild = parent*2 + 2;
int minIndex = parent;
if(lchild < a.length && a[parent] > a[lchild]){
minIndex = lchild;
}
if(rchild < a.length && a[minIndex] > a[rchild]){
minIndex = rchild;
}
if(minIndex == parent){
return ;
}else {
swap(a,parent,minIndex);
parent = minIndex;
}
}
}

public static void main(String[] args) {
//        int[] array = {2,1,49,30,32,-1,20,50,49};

int[] array = {26,5,98,108,28,99,100};
/*
Scanner in = new Scanner(System.in);
int m = in.nextInt();
array = new int[m];
for(int i = 0 ; i < m;i++){
array[i] = in.nextInt();
}
*/
System.out.println("before sort:" + Arrays.toString(array));
long start = System.nanoTime();
//        insertSort(array);
//      selectSort(array);
//        mergerSort(array);
//        quickSort(array,0,array.length - 1);
int[] heap = getMinKNumsByHeap(array,3);
System.out.println(System.nanoTime() - start);
System.out.println("After sort:"+Arrays.toString(heap));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: