我正在尝试为我的家庭作业找到有效的解决方案。气泡排序还是插入排序?

时间:2018-11-05 16:52:03

标签: algorithm sorting

大家好,我有一个问题。这是我的任务,如下:

让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); 
} 

}

1 个答案:

答案 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--;
        }
    }
}