注:以下实例都是从小到大排序
简单选择排序
思想
简单选择排序的思想很简单,把一个待排序序列分为两个部分:已排序部分和未排序部分。已排序部分不动,未排序部分中选择最小的一个元素和其第一个元素交换,然后该元素纳入已排序部分,其他元素同样的操作,直到未排序部分只剩最后一个元素为止。
例如:
java代码
class Sort{
public static void main(String[] args) {
int[] data = {34,8,64,51,32,21,77,2};
selectSort(data);
for(int x : data)
System.out.print(x+" ");
System.out.println();
}
public static void selectSort(int[] array) {
for(int i=0; i<array.length-1; i++) {
int minIdx = i;
for(int j=i+1; j<array.length; j++) {
if(array[j] < array[minIdx])
minIdx = j;
}
if(minIdx != i)
swap(array, i, minIdx);
}
}
public static void swap(int[] array, int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
堆排序
思想
从小到大的堆排序:
- 根据数组建立一个堆,及一棵完全二叉树;
- 将堆调整为一个最大堆,则堆顶元素就是最大的数字;
- 交换栈顶元素和当前最大堆的最后一个元素;
- 固定当前堆的最后一个元素,剩下的元素仍然构成一个堆(但不是最大堆)
- 返回2,直到堆中元素个数为2。
至此,排序结束。
动态过程可以参考视频:https://www.bilibili.com/video/av18980178/
java代码
class Sort{
public static void main(String[] args) {
int[] data = {34,8,64,51,32,21,77,2};
heapSort(data);
for(int x : data)
System.out.print(x+" ");
System.out.println();
}
public static void heapSort(int[] array) {
int len = array.length;
// 每调整一次最大堆,就将根结点和未调整的最后一个结点交换
// 则从后往前完成排序
// 每次调整只针对未排序的数组部分,所以每次进行调整的个数-1
for(int i=0; i<len-1; i++) {
buildMaxHeap(array, len-1-i);
swap(array, 0, len-1-i);
}
}
public static void buildMaxHeap(int[] array, int lastIdx) {
// 从最后一个结点的父结点开始
for(int i=(lastIdx-1)/2; i>=0; i--) {
int p = i;
// 判断当前结点有无左孩子,若有说明不是叶子结点
while(p*2+1 <= lastIdx) {
int left = 2*p + 1;
int biggerIdx = left;
// 判断有无右孩子(right=left+1)
if(left<lastIdx && array[left]<array[left+1])
biggerIdx += 1;
// 若存在孩子大于父结点,将较大的子结点和父结点交换,并向下调整
if(array[p]<array[biggerIdx]) {
swap(array, p, biggerIdx);
p = biggerIdx;
}
else
break;
}
}
}
public static void swap(int[] array, int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}