如何实现在O(n)时间内排序,并且空间复杂度为O(1)
??? 對于常見的排序算法,很難做到在O(n)時間內排序,并且空間復雜度為O(1),這里提供了一種方法可以達到要求。
? ? 可以使用哈希排序的思想,也就是將所有的數哈希到哈希表中,實現排序。具體的算法思想是,求出這組數據的最大值和最小值,分三種情況討論:
? ? ? ? ? ? ?1、如果最小值為負數,在哈希的時候把每個數都加上最小值的相反數,作為數組的下標值。
? ? ? ? ? ? ?2、如果最小值為0,則直接將每個數作為下標值
? ? ? ? ? ? ?3、如果最小值為正數,則將每個數減去最小值作為下標值
? ? ? ? ? ? ?綜合三種情況,可以歸結為一個方法,就是令每個數減去最小值即可。
? ? ? ? ? 這樣就可以建立一個數組,下標作為key,數組值作為value,初始化每個value為0,表示不存在對應的key值,當出現對應的key值時,就令其value值加1,如果存在重復的值,就將下標對應的value值重復加1計數,最后打印輸出的時候,從頭開始掃描數組,當value不為0時,將對應的key值加上或減去最小值輸出即可,如果value大于1,就重復輸出。
? ? ? ? ? ?JAVA代碼實現如下:
1 public class HeapSort { 2 3 public static void heapsort(int[] array){ 4 int n=array.length; //求出原數組長度 5 if(n<=0)return; //如果數組長度為0,直接退出 6 7 int min=array[0],max=array[0]; 8 System.out.print("排序前:"); 9 for(int i=0;i<n;i++) //輸出排序前的數組,并求出最大值和最小值 10 { 11 if(min>array[i])min=array[i]; 12 if(max<array[i])max=array[i]; 13 System.out.print(array[i]+" , "); 14 } 15 System.out.println(); 16 17 int[] H=new int[max-min+1]; //哈希表 18 for(int i=0;i<H.length;i++) //初始化哈希表 19 H[i]=0; 20 21 for(int i=0;i<n;i++) //哈希排序 22 H[array[i]-min]++; 23 24 System.out.print("排序后:"); //輸出排序后的數組 25 for(int i=0;i<H.length;i++) 26 for(int j=1;j<=H[i];j++) 27 System.out.print(i+min+" , "); 28 } 29 30 public static void main(String[] args) { 31 int[] array={-5,6,9,15,-3,9}; 32 heapsort(array); //調用哈希排序 33 } 34 35 } View Code?
程序輸出結果為:
排序前:-5 , 6 , 9 , 15 , -3 , 9 ,?
排序后:-5 , -3 , 6 , 9 , 9 , 15 ,?
轉載于:https://www.cnblogs.com/guozhenqiang/p/5424441.html
總結
以上是生活随笔為你收集整理的如何实现在O(n)时间内排序,并且空间复杂度为O(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux系统编程7:入门篇之Linux
- 下一篇: (王道408考研数据结构)第二章线性表-