排序

// 冒泡排序
private void bubbleSort(int[] initSortArray) {
int temp;
boolean isSort = false;
for(int i = 0; i < initSortArray.length; i++) {
for(int j = 1; j < initSortArray.length - i; j++) {
temp = initSortArray[j-1];
if(temp > initSortArray[j]) {
initSortArray[j-1] = initSortArray[j];
initSortArray[j] = temp;
isSort = true;
}
}
if(!isSort) {
break;
}
}
}


// 选择排序
public void selectSort(int[] initSortArray) {
// 总共要经过 N-1 轮比较
for (int i = 0; i < initSortArray.length - 1; i++) {
int min = i;
// 每轮需要比较的次数 N-i
for (int j = i + 1; j < initSortArray.length; j++) {
if (initSortArray[j] < initSortArray[min]) {
// 记录目前能找到的最小值元素的下标
min = j;
}
}

// 将找到的最小值和i位置所在的值进行交换
if (i != min) {
int tmp = initSortArray[i];
initSortArray[i] = initSortArray[min];
initSortArray[min] = tmp;
}
}
}

// 插入排序
public void insertSort(int[] initSortArray) {
for (int i = 1; i < initSortArray.length; i++) {
// 记录要插入的数据
for(int j = i-1; j >= 0; j--) {
if(initSortArray[j+1] < initSortArray[j]) {
int temp = initSortArray[j];
initSortArray[j] = initSortArray[j+1];
initSortArray[j+1] = temp;
}
}
}
}

// 希尔排序
public void shellSort(int[] initSortArray) {
int gap = initSortArray.length;
while (gap > 0) {
for (int i = gap; i < initSortArray.length; i++) {
for(int j = i-gap; j >= 0; j-=gap) {
int temp = initSortArray[j];
if(temp > initSortArray[j + gap]) {
initSortArray[j] = initSortArray[j + gap];
initSortArray[j + gap] = temp;
}
}
}
gap = gap / 2;
}
}

// 快速排序
public static void quickSort(int a[],int m,int n){
if(m>=n)
return;
int i = m; int j = n; int key = a[m];//选择第一个数为key
while(i<j){
while(i<j && a[j]>=key)//从右向左找第一个小于key的值
j--;
if(i<j){
a[i] = a[j];
i++;
}
while(i<j && a[i]<key)//从左向右找第一个大于key的值
i++;
if(i<j){
a[j] = a[i];
j--;
}
}
//i == j
a[i] = key;
quickSort(a, m, i-1);//递归调用
quickSort(a, i+1, n);//递归调用
}


// 堆排序
//构建最小堆
public static void MakeMinHeap(int a[], int n){
for(int i=(n-1)/2 ; i>=0 ; i--){
MinHeapFixDown(a,i,n);
}
}
//从i节点开始调整,n为节点总数 从0开始计算 i节点的子节点为 2*i+1, 2*i+2
public static void MinHeapFixDown(int a[],int i,int n){

int j = 2*i+1; //子节点
int temp = 0;

while(j<n){
//在左右子节点中寻找最小的
if(j+1<n && a[j+1]<a[j]){
j++;
}

if(a[i] <= a[j])
break;

//较大节点下移
temp = a[i];
a[i] = a[j];
a[j] = temp;

i = j;
j = 2*i+1;
}
}

public static void MinHeap_Sort(int a[],int n){
int temp = 0;
MakeMinHeap(a,n);
for(int i=n-1;i>0;i--){
temp = a[0];
a[0] = a[i];
a[i] = temp;
MinHeapFixDown(a,0,i);
}
}
posted @ 2020-03-02 09:21  静思,随心  阅读(112)  评论(0编辑  收藏  举报