直接插入排序、折半插入排序、Shell排序、冒泡排序,選擇排序

來源:互聯網
上載者:User

標籤:

一、直接插入排序穩定,時間複雜度:最好O(n)、最差O(n^2)、平均O(n^2)。空間複雜度O(1)

void InsertSort(int L[], int n){int i, j,key;for (i = 1; i<n; i++)if(L[i] < L[i-1])//須要將L[i]插入到有序表L[0...i-1]{key = L[i];for(j = i-1; j >= 0 && key < L[j]; j--)//後移L[j+1] = L[j];L[j+1] = key;//插入到正確位置}}

二、二分插入排序尋找插入位置時使用二分尋找。穩定。最佳情況O(n lg n),最差和平均情況O(n^2),空間複雜度O(1)。


void BInsertSort(int L[], int n){int i, j,key, low, mid, high;for (i = 1; i < n; i++){key = L[i];low = 0; high = i-1;while(low <= high)//在有序的L[low,...,high]中折半尋找有序插入的位置{mid = (low+high)/2;if(key < L[mid])high = mid - 1;elselow = mid + 1;}for (j = i-1; j>=high+1;j--)//後移//j >= lowL[j+1] = L[j];L[high+1] = key;//插入key   //L[low] = key}}

三、希爾排序不穩定,時間複雜度在理想情況下是O(nlgn),最壞情況為O(n^2)。空間複雜度O(1)

void ShellSort(int L[], int n){int gap = n,i, j, tmp;int k1=0, k2;while (gap > 1)//一趟shell排序{k1++;k2=0;gap = gap/3+1;for(i = gap; i < n; i++)if(L[i] < L[i-gap]){k2++;tmp = L[i];for(j = i-gap;j>=0 && tmp < L[j]; j -= gap)L[j+gap] = L[j];L[j+gap] = tmp;//printf("gap=%d,%d_%d: ",gap,k1, k2);Print(L, n);}}}

四、冒泡排序

穩定,時間複雜度最好O(n),最壞和平均情況為O(n^2)。空間複雜度O(1)。


void BubbleSort(int L[], int n){bool exchange;int i, j;for(i = 0; i < n; i++){exchange = false;for(j = n-1; j >i; j--)if(L[j] < L[j-1])//這裡是小的數往上一直交換{std::swap(L[j], L[j-1]);exchange = true;}if(!exchange)break;}}

雙向冒泡排序:

//改進版的冒泡排序(雙向冒泡)void bidBubbleSort(int a[], int n){    int left, right, t, l, r, j, i = 0;     left =0;    right = n -1;     //雙向冒泡演算法,極大的降低了迴圈排序的次數    while(left < right)    {        //必需要給l和r賦值,否則若數組一開始就有序,則right=r中的r未賦值。即報錯        l = left + 1;        r = right -1;          //第一次迴圈將最大的值放到末尾        for(j = left; j < right; j++)        {            if(a[j] > a[j + 1])            {                t = a[j];                a[j] = a[j + 1];                a[j + 1] = t;                r = j;            }        }        right = r;         //第二次迴圈將最小的值放到了開頭        for(j = right; j > left; j--)        {            if(a[j] < a[j - 1])            {                t = a[j];                a[j] = a[j - 1];                a[j - 1] = t;                l = j;            }        }        left = l;         printf("第%d次排序結果:", i + 1);        i++;        for(j = 0; j < n; j++){            printf("%d\t", a[j]);        }    }     printf("終於排序結果: ");    for(j = 0; j < n; j++){        printf("%d\t", a[j]);    }}

五、簡單選擇排序

不穩定。時間複雜度O(n^2)。

空間複雜度O(1)。

void SlectSort(int L[], int n){int i, j, index;for(i = 0; i < n-1; i++){index = i;for(j = i+1; j < n; j++)if(L[j] < L[index])index = j;if(index != i)std::swap(L[i], L[index]);}}
參考:http://blog.csdn.net/han_xiaoyang/article/details/12163251#t128

三白話經典演算法系列 Shell排序實現

著作權聲明:本文部落格原創文章。部落格,未經同意,不得轉載。

直接插入排序、折半插入排序、Shell排序、冒泡排序,選擇排序

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.