標籤:
一、直接插入排序穩定,時間複雜度:最好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排序、冒泡排序,選擇排序