輸入:多次測試,第一行為陣列元素個數,第二行為陣列元素。
輸出:陣列排序後相鄰元素的最大差值。
該題關鍵看思路3.
思路1,先將陣列排序,然後設定乙個全域性變數為最大值,相減之後作比較。如果在演算法時間複雜度沒有要求的話直接使用思路1即可,不需要將差值存起來。思路2,先將陣列排序,然後設定乙個vector,將相鄰元素差值存入大根堆,最後輸出堆首即可
思路3,利用桶排序的思想,可以實現演算法時間複雜度為o(n)
思路1,簡單的氣泡排序,然後比較即可
#includeusing namespace std;
void swap(int arr,int i, int j)
void buble_sort(int arr, int arr_len)
} }}int get_max(int a, int b)
int main()
buble_sort(p, n);
int max_gap = 0;
for (int i = 0; i < n-1; i++)
cout << max_gap << endl;;
} return 0;
}
思路2:主要是想練習一下大根堆的建立,如果沒有必要只要求輸出的話不需要存放起來再輸出。建立大根堆之後直接輸出堆首即可
//堆排序
#includeusing namespace std;
void swap(int arr,int i, int j)
void buble_sort(int arr, int arr_len)
} }}int get_max(int a, int b)
//建立大根堆的過程
void heap_insert(int arr, int index)
}int main()
buble_sort(p, n);
int* ptr = new int[n - 1];
for (int i = 0; i < n-1; i++)
cout << ptr[0] << endl;
} return 0;
}
思路3:為n個數建立n+1個桶,然後每個桶用三個陣列表示:該桶是否進來過數,該桶的最大值,該桶的最小值建立n+1個桶這樣肯定存在乙個空桶,目的是排除最大的差值來自於同乙個桶,那麼排序後的陣列元素相鄰差的最大值肯定發生在每乙個非空桶的最小值與其前乙個桶的最大值之差。
//堆排序
#includeusing namespace std;
int get_min(int a, int b)
int get_max(int a, int b)
//對陣列求最小值
int find_min(int arr,int arr_len)
return min;
}//對陣列求最大值
int find_max(int arr, int arr_len)
return max;
}//交換函式
void swap(int arr, int i, int j)
//獲取num放在那個桶
int bucket(long num, long len, long min, long max)
//返回最大的序號
int maxgap(int arr,int arr_len)
int min = find_min(arr, arr_len);
int max = find_max(arr, arr_len);
if (min == max)
//建立三個陣列,分別存放該桶是否進來過數,該桶的最大值,該桶的最小值
題目 輸入乙個已經按公升序排序過的陣列和乙個數字,
第14題 題目 輸入乙個已經按公升序排序過的陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。要求時間複雜度是o n 如果有多對數字的和等於輸入的數字,輸出任意一對即可。例如輸入陣列1 2 4 7 11 15和數字15。由於4 11 15,因此輸出4和11。c codes as ...
題目 輸入乙個已經按公升序排序過的陣列和乙個數字,
第14題 題目 輸入乙個已經按公升序排序過的陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。要求時間複雜度是o n 如果有多對數字的和等於輸入的數字,輸出任意一對即可。例如輸入陣列1 2 4 7 11 15和數字15。由於4 11 15,因此輸出4和11。c codes as ...
乙個新奇的陣列排序方法
最近在複習基礎知識的時候,看到math物件的max方法時,突然想起來前一段經常看的陣列排序方法,但是沒有發現有用math.max方法實現的排序,於是閒來無聊,就自己寫了乙個比較逗的排序方式,此排序法純屬娛樂,似乎我目前看起來也沒什麼實用價值,不過,還是寫篇文章分享下思路,畢竟有點個人想法不容易。思路...