6種基本排序(C++實現)
阿新 • • 發佈:2019-02-12
六種基本排序...包括氣泡排序,直接插入排序,直接選擇排序,希爾排序,歸併排序,快速排序.第七種堆排序目前理解的不是很好,未完成.
執行時間方便比較排序時間效率,N可以改變陣列元素個數方便測試,隨機數用來生成隨機陣列.
C++實現如下:
// arraySort.cpp : 陣列排序 // #include <iostream> #include <ctime> #include <cstdlib> using namespace std; const int N = 100; //陣列元素個數 const int RAND = 1000; //隨機數範圍 void sortMP(int a[], int n); //氣泡排序 void sortZC(int a[], int n); //直接插入排序 void sortZX(int a[], int n); //直接選擇排序 void sortShell(int a[], int n); //希爾排序 void sortKP(int a[], int l, int r); //快速排序 void sortD(int a[], int n); //堆排序(暫未完成) void sortG(int a[], int low, int mid, int high, int temp[]);//歸併排序(合併) void sortMerge(int a[], int low, int high, int temp[]);//歸併排序(遞迴) 主函式呼叫 void printarray(int a[],int n); //列印陣列 int main() { int a[N]; srand((int)time(NULL)); //每次執行種子不同,生成不同的隨機數 for (int i = 0; i < N; i++) { a[i] = rand() % RAND; } clock_t start_time = clock(); sortMP(a, N); //sortZC(a, N); //sortZX(a, N); //sortShell(a, N); // 歸併排序 /* int *p = new int[N]; sortMerge(a, 0,N-1,p); cout<<"歸併排序結果: "; printarray(a, N); */ // 快速排序 /* sortKP(a,0,N-1); cout << "快速排序結果: "; printarray(a, N); */ //sortD(a, N); 暫未完成 clock_t end_time = clock(); cout << "執行時間: " << static_cast<double>(end_time - start_time) / CLOCKS_PER_SEC * 1000 << "ms" << endl; system("pause"); return 0; } void sortMP(int a[], int n)//氣泡排序 { for (int i = 0; i < n; i++) { for (int j = 1; j < n - i; j++) if (a[j - 1] < a[j]) //從大到小 swap(a[j - 1], a[j]); } cout << "冒泡1排序結果: "; printarray(a, n); int flag = n; while (flag > 0) { int k = flag; flag = 0; for (int j = 1; j < k; j++)//從小到大 { swap(a[j - 1], a[j]); flag = j; } } cout << "冒泡2排序結果: "; printarray(a, n); } void sortZC(int a[], int n)//直接插入排序 { for (int i = 1; i < n; i++) { int j = 0; if (a[i] < a[i - 1]) { int temp = a[i]; for (j = i - 1; j >= 0 && a[j] > temp; j--) a[j + 1] = a[j]; a[j + 1] = temp; } } cout << "直接插入結果: "; printarray(a, n); } void sortZX(int a[], int n) //直接選擇排序 { int min; for (int i = 0; i < n; i++) { min = i; for(int j=i+1;j<n;j++) if (a[j] < a[min]) { min = j; } swap(a[i], a[min]); } cout << "直接選擇結果: "; printarray(a, n); } void sortShell(int a[], int n)//希爾排序 { /****** 本塊方便理解 int gap; for (gap = n / 2; gap > 0; gap /= 2) for (int i = 0; i < gap; i++) { for (int j = i + gap; j < n; j += gap) { if (a[j] < a[j - gap]) { int temp = a[j]; int k = j - gap; while (k >= 0 && a[k] > temp) { a[k + gap] = a[k]; k -= gap; } a[k + gap] = temp; } } }*/ int gap; //此塊分排序部分為冒泡思想 for(gap =n/2;gap>0;gap/=2) for(int i=gap;i<n;i++) for (int j = i - gap; j >= 0 && a[j] > a[j + gap]; j -= gap) { swap(a[j], a[j + gap]); } cout << "希爾排序結果: "; printarray(a, n); } void sortG(int a[], int low, int mid, int high, int temp[])//歸併排序(合併) { int i, j, k; i = low; j = mid + 1;//避免重複比較a[mid] k = 0; while (i <= mid && j <= high) { if (a[i] <= a[j]) temp[k++] = a[i++]; else temp[k++] = a[j++]; } while (i <= mid) temp[k++] = a[i++]; while (j <= high) //a[low,mid]已經全部歸入temp陣列,(mid,high]還有剩餘 temp[k++] = a[j++]; for (i = 0; i < k; i++) a[low + i] = temp[i]; //應從a[low+i]開始賦值 } void sortMerge(int a[], int low, int high, int temp[])//歸併排序(遞迴) 主函式呼叫 { if (low < high) { int mid = (low + high) / 2; sortMerge(a, low, mid, temp); //左邊有序 sortMerge(a, mid + 1, high, temp); //右邊有序 sortG(a, low, mid, high, temp); //合併 } } void sortKP(int a[], int l, int r) //快速排序 { if (l < r) { int i = l, j = r, x = a[l]; while (i < j) { while (i < j&&a[j] >= x) j--; if (i < j) a[i++] = a[j]; while (i < j&&a[i] < x) i++; if (i < j) a[j--] = a[i]; } a[i] = x; sortKP(a, l, i - 1); //左 sortKP(a, i + 1, r); //右 } } void sortD(int a[], int n) //堆排序(未完成) { } void printarray(int a[],int n) //列印函式 { for (int i = 0; i < n; i++) cout << a[i] << " "; cout << endl; }