C++常见排序

【直接插入法1】假第n个元素之前已经从排列好,那么从第n-1个元素开始往前循环,每个元素与第n个元素比较,如果比第n个元素大,那么这个元素后移一位,直到找到比第n个元素小的元素,因为这个元素之前的元素都比第n个元素小,所以不需要再比较了,这个元素换成第n个元素的值。这样前n个元素就排好了。

void InsertSort(int arr[], int len) {
    int i, j;
    int temp;
    for (i = 1; i < len; i++) {
        temp = arr[i];
        for (j = i - 1; j >= 0 && arr[j] > temp;j--)
            arr[j + 1] = arr[j];
        arr[j + 1] = temp;
    }
}

【直接插入法2】和直接插入法1相似,只是从第n个元素开始往前循环,第n-1个和第n个比较,如果大就交换,再比较第n-2与第n-1个,一直循环到第0个与第1个,或者前一个比后一个小就退出。

void InsertSort(int arr[],int n){
    for (int i=1;i<n;i++){
        for(int j=i;j>0 && arr[j-1]>arr[j];j--){
            int temp = arr[j];
            arr[j] = arr[j-1];
            arr[j-1] = temp;
        }
    }
}

插入排序的时间复杂度最好的情况是已经是正序的序列,只需比较(n-1)次,时间复杂度为O(n),最坏的情况是倒序的序列,要比较n(n-1)/2次,时间复杂度为O(n^2 ) ,平均的话要比较时间复杂度为O(n^2 )

【冒泡法】遍历数组的前n-1项,

void BubbleSort(int arr[], int n)
{
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

第一个for循环是遍历所有元素,第二个for循环是每次遍历元素时都对无序区的相邻两个元素进行一次比较,若反序则交换,这样每一次遍历都把当前遍历的最大元素放到后面,后面部分是排序好的。当i=0时找到数组的最大元素,放到n-1的位置,第二次遍历找到第二大元素,放到n-2的位置。

时间复杂度最坏的情况是反序序列,要比较n(n-1)/2次,时间复杂度为O(n^2 ),最好的情况是正序,只进行(n-1)次比较,不需要移动,时间复杂度为O(n),而平均的时间复杂度为O(n^2 )

【冒泡排序优化】当第2个循环没有发生交换的时候,说明都已经排序好了,这时不需要再循环了。

void BubbleSort(int arr[], int n)
{
    int current;
    for (int i = 0; i < n - 1; i++){
        for (int j = 0; j < n - i - 1; j++){
            current = 0;
            if(arr[j] > arr[j + 1]){
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                current = j;
            }
        }
        if (current == 0) break;
     }
}

 【快速排序】快速排序的思路是先找出一个轴值(用oncesort找,oncesort是把第一个数放到合适的位置,使它左边的数字都比它小,右边的数字都比它大,oncesort返回这个位置),然后把数组分成左边一部分和右边一部分,分别进行排序,一直递归下去。

int OnceSort(int arr[], int first, int end){
    int i = first,j = end;
    while(i < j){
        while(i < j && arr[i] <= arr[j]) j--;/
        if(i < j){
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        while(i < j && arr[i] <= arr[j]) i++;
        if(i < j){
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            
        }
    }
    return i;
}
void QuickSort(int arr[], int first, int end){
    if (first < end) {
        int pivot = OnceSort(arr,first,end);
        cout<<pivot<<endl;
        QuickSort(arr,first,pivot-1);
        QuickSort(arr,pivot+1,end);
    }
}

猜你喜欢

转载自www.cnblogs.com/ziyuwang/p/10395907.html
今日推荐