大家好,我有一个问题。这是我的任务,如下:
让A []是长度为N的自然数数组,对它进行部分排序,即,存在这样的索引i(0
对于这个问题,哪种方法更好?气泡排序还是插入排序?还是有更有效的解决方案?我更喜欢气泡排序来完成此任务,但我愿意接受其他意见
static void bubbleSort(int arr[], int n)
{
int i, j, temp;
boolean swapped;
for (i = 0; i < n - 1; i++)
{
swapped = false;
for (j = 0; j < n - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
// swap arr[j] and arr[j+1]
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}
if (swapped == false)
break;
}
}
static void printArray(int arr[], int size)
{
int i;
for (i = 0; i < size; i++)
System.out.print(arr[i] + " ");
System.out.println();
}
public static void main(String args[])
{
int arr[] = { 1, 8, 45, 12, 22, 11, 90 };
int n = arr.length;
bubbleSort(arr, n);
System.out.println("Sorted array: ");
printArray(arr, n);
}
}
答案 0 :(得分:0)
气泡排序算法的复杂度为O(n ^ 2)。即使使用if (swapped == false) break;
也无助于降低复杂性(尝试{2,3,4,5,1},您会发现)。
由于存在这样的索引i(0 < i < N-1)
,因此对subaray A[0],...,A[i]
进行了递增排序,并对子数组A[i+1],...,A[N]
进行了递增排序。可以在O(n)运行时解决此问题。复杂。如果我们在其中i
处找到索引A[0:i] and A[i+1:n] are sorted
,那么我们可以认为这个问题是将两个排序的数组合并为一个数组,这可以在O(n)时间内完成。算法如下:
void sortPartialSortedArray(int arr[], int n)
{
int pos = 0;
// find the position for which arr[0:pos] and arr[pos+1:n] is sorted
for(int i=0; i+1<n; i++) {
if(arr[i]>arr[i+1]) {
pos = i;
}
}
int i = pos, j= n-1;
// sort it from last position
while(i>=0 && j>=0) {
if(arr[i] > arr[j]) {
swap(arr[i],arr[j]);
}
j--;
if(i==j) {
i--;
}
}
}