👻选择排序
选择排序的基本思想:
每一趟(第i趟)在后面n-i+1(i=1,2,···,n-1)个待排序元素中 选取关键字最小的元素,作为有序子序列的第i个元素,直到n—1趟做完,待排序元素只剩下一个,就不用再选了。
🎡1、直接选择排序
直接选择排序是一种简单直观的排序算法。它的基本思想是每次从未排序的部分中找到最小(或最大)的元素,将其与未排序部分的第一个元素交换位置,然后缩小未排序部分的范围,继续进行选择和交换,直到整个序列有序。
如图:
🪄代码示例:
public static void selectSort(int[] array) {
for (int i = 0; i < array.length; i++) {
int minIndex = i;
int j = i+1;
for (; j < array.length; j++) {
if(array[j] < array[minIndex]) {
minIndex = j;
}
}
swap(array,i,minIndex);
}
}
private static void swap(int[] array,int i,int j) {
int tmp = array[j];
array[j] = array[i];
array[i] = tmp;
}
🎡2、堆排序
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。
如图:
🪄代码示例:
public static void heapSort(int[] array){
//创建大根堆
createHeap(array);
int end = array.length-1;
while (end > 0) {
swap(array,0,end);
siftDown(array,0,end);
end--;
}
}
private static void createHeap(int[] array) {
for (int parent = (array.length-1-1)/2; parent >= 0 ; parent--) {
siftDown(array,parent,array.length);
}
}
private static void siftDown(int[] array,int parent,int len) {
int child = (2*parent)+1;
while (child < len) {
if(child + 1 < len && array[child] < array[child+1]) {
child = child+1;
}
if(array[child] > array[parent]) {
swap(array,child,parent);
parent = child;
child = 2*parent+1;
}else {
break;
}
}
}
private static void swap(int[] array,int i,int j) {
int tmp = array[j];
array[j] = array[i];
array[i] = tmp;
}
🎉OK!今天的分享就到这里了,后面还会分享更多排序算法,敬请关注喔!!!✌️