1.並べ替えを選択します
-
原則:順序付けされていない間隔から最大(または最小)の要素が選択されるたびに、並べ替えられるすべてのデータ要素が配置されるまで、順序付けられていない間隔の最後(または最前面)に格納されます。
-
安定性(不安定)
1。安定したシーケンスは不安定なシーケンスになる可能性があります;
2。安定したシーケンスは安定することができません; -
スペースの複雑さ:O(1)
-
時間計算量:O(O(n ^ 2))
public static void selectsort(int[] arr){
for (int i =0;i < arr.length;i++){
for (int j = i+1;j < arr.length;j++){
if(arr[i] > arr[j]){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
}
2.ヒープソート
-
安定性(不安定)
1。安定したシーケンスは不安定なシーケンスになる可能性があります;
2。安定したシーケンスは安定することができません; -
スペースの複雑さ:O(1)
-
時間計算量:O(n * logn)
public static void heapsort(int[] arr){
//首先将数组元素放入一个堆
createheap(arr);
int end = arr.length-1;//因为后面要将堆头和最后一个元素交换位置
while(end > 0){
int tmp = arr[0];
arr[0] = arr[end];
arr[end] = tmp;
adjustDown(arr,0,end);//调用向下调整方法重新构造大根堆
end--;//构造完之后,将最后一个元素去掉
}
}
//构造一个堆
public static void createheap(int[] arr){
for(int i =(arr.length-1-1)/2;i >= 0;i--){
adjustDown(arr,i,arr.length);
}
}
//向下调整方法
public static void adjustDown(int[] arr,int parent,int len){
//计算左孩子节点下标
int child = 2*parent+1;
while(child < len){
//左右孩子选择最大的
if(child+1 < len && arr[child] < arr[child+1]){
child++;
}
//到了这一步,已经找到最大的孩子,和双亲进行比较
if (arr[child] > arr[parent]){
int tmp = arr[child];
arr[child] = arr[parent];
arr[parent] = tmp;
parent = child;
child = 2*parent+1;
}else{
break;
}
}
}
3.2つのコード結果テスト
public class TestSort {
//选择排序
public static void selectsort(int[] arr){
for (int i =0;i < arr.length;i++){
for (int j = i+1;j < arr.length;j++){
if(arr[i] > arr[j]){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
}
//堆排序
public static void heapsort(int[] arr){
//首先将数组元素放入一个堆
createheap(arr);
int end = arr.length-1;//因为后面要将堆头和最后一个元素交换位置
while(end > 0){
int tmp = arr[0];
arr[0] = arr[end];
arr[end] = tmp;
adjustDown(arr,0,end);//调用向下调整方法重新构造大根堆
end--;//构造完之后,将最后一个元素去掉
}
}
//构造一个堆
public static void createheap(int[] arr){
for(int i =(arr.length-1-1)/2;i >= 0;i--){
adjustDown(arr,i,arr.length);
}
}
//向下调整方法
public static void adjustDown(int[] arr,int parent,int len){
//计算左孩子节点下标
int child = 2*parent+1;
while(child < len){
//左右孩子选择最大的
if(child+1 < len && arr[child] < arr[child+1]){
child++;
}
//到了这一步,已经找到最大的孩子,和双亲进行比较
if (arr[child] > arr[parent]){
int tmp = arr[child];
arr[child] = arr[parent];
arr[parent] = tmp;
parent = child;
child = 2*parent+1;
}else{
break;
}
}
}
//主函数main用来测试
public static void main(String[] args) {
//选择排序
int[] arr2 = {
7,4,9,34,0,8,5,22,55,6,12,33,56,89,77};
selectsort(arr2);
System.out.print("选择排序结果: ");
for (int i = 0;i < arr2.length;i++){
System.out.print(arr2[i]+" ");
}
System.out.println();
//堆排序
int[] arr4 = {
7,4,9,34,0,8,5,22,55,6,12,33,56,89,77};
heapsort(arr4);
System.out.print("堆排序结果: ");
for (int i = 0;i < arr4.length;i++){
System.out.print(arr4[i]+" ");
}
System.out.println();
}
}