常见排序算法的时间复杂度以及稳定性:
1 public class Sort {
2 public static void main(String[] args){
3 int[] nums=new int[]{2,6,9,4,1,8,5,5,6};
4 //SelectSort(nums);
5 //BubbleSort(nums);
6 //InsertSort(nums);
7 //FastSort(nums,0,nums.length-1);
8 //MergeSort(nums,0,nums.length-1);
9 HeapSort(nums);
10 for(int i=0;i<nums.length;i++){
11 System.out.print(nums[i]+" ");
12 }
13
14 }
15
16 private static void Swap(int[] nums,int i,int j){
17 int val=nums[i];
18 nums[i]=nums[j];
19 nums[j]=val;
20 }
21 /*
22 选择排序
23 */
24 private static void SelectSort(int[] nums){
25 for(int i=0;i<nums.length;i++){
26 int index=i;
27 for(int j=i+1;j<nums.length;j++){
28 if(nums[j]<nums[index]) index=j;
29 }
30 Swap(nums,i,index);
31 }
32 }
33
34 /*冒泡排序*/
35 private static void BubbleSort(int[] nums){
36 for(int i=nums.length-1;i>0;i--){ //外层循环控制排序的轮数
37 boolean isSorted=true;
38 for(int j=0;j<i;j++){ //内层循环每次将未排序序列中最大的数冒泡到最后端
39 if(nums[j]>nums[j+1]){
40 Swap(nums,j,j+1);
41 isSorted=false;
42 }
43 }
44 if(isSorted) break;
45 }
46 }
47
48 /*插入排序*/
49
50 private static void InsertSort(int[] nums){
51 for(int i=1;i<nums.length;i++){
52 int val=nums[i];
53 int j=i;
54 while(j>0&&nums[j-1]>val){
55 nums[j]=nums[j-1];
56 j--;
57 }
58 nums[j]=val;
59 }
60 }
61
62 /*快速排序*/
63 private static void FastSort(int[] nums,int start,int end){
64 if(start>=end) return ;
65 int val=nums[start];
66 int i=start,j=end;
67 while(i<j){
68 while(i<j&&nums[j]>val){
69 j--;
70 }
71 if(i<j){
72 nums[i]=nums[j];
73 i++;
74 }
75 while(i<j&&nums[i]<val){
76 i++;
77 }
78 if(i<j){
79 nums[j]=nums[i];
80 j--;
81 }
82 }
83 nums[i]=val;
84 FastSort(nums,start,i-1);
85 FastSort(nums,i+1,end);
86 }
87
88 /*归并排序*/
89 private static void MergeSort(int[] nums,int start,int end){
90 if(start>=end||nums.length==1) return ;
91 int mid=start+(end-start)/2;
92 MergeSort(nums,start,mid);
93 MergeSort(nums,mid+1,end);
94 Merge(nums,start,mid,end);
95 }
96 private static void Merge(int[] nums,int start,int mid,int end){
97 int len1=mid-start+1,len2=end-mid;
98 int[] left=new int[len1];
99 int[] right=new int[len2];
100 int i=0,j=0,k=0;
101 for(k=start;i<len1;i++,k++){
102 left[i]=nums[k];
103 }
104 for(k=mid+1;j<len2;j++,k++){
105 right[j]=nums[k];
106 }
107 for(k=start,i=0,j=0;i<len1&&j<len2;k++){
108 if(left[i]<=right[j]){
109 nums[k]=left[i];
110 i++;
111 }else{
112 nums[k]=right[j];
113 j++;
114 }
115 }
116 if(i<len1){
117 while(i<len1){
118 nums[k++]=left[i++];
119 }
120 }else{
121 while(j<len2){
122 nums[k++]=right[j++];
123 }
124 }
125 }
126
127 /*堆排序*/
128 private static void HeapSort(int[] nums){
129 //1.建立堆
130 for(int i=nums.length/2-1;i>=0;i--){
131 adjustHeap(nums,i,nums.length-1);
132 }
133 //2.调整堆
134 for(int i=nums.length-1;i>0;i--){
135 int val=nums[i];
136 nums[i]=nums[0];
137 nums[0]=val;
138 adjustHeap(nums,0,i-1);
139 }
140 }
141 private static void adjustHeap(int[] nums,int pos,int end){
142 int temp=nums[pos];
143 int child=0;
144 for(;2*pos+1<=end;pos=child){
145 child=2*pos+1;
146 if(child<end&&nums[child+1]>nums[child]){
147 child++;
148 }
149 if(nums[child]>temp){
150 nums[pos]=nums[child];
151 }
152 else break;
153 }
154 nums[child]=temp;
155 }
156 }