C++排序算法
阿新 • • 發佈:2018-09-05
str heapsort art 叠代 數組 std star else 思想
參考http://www.cnblogs.com/zyb428/p/5673738.html#commentform
修改了部分代碼的錯誤。
一、直接插入排序
大循環取i=1,到n,依次++i;小循環取j=i,到0,依次--j;循環語句:使用temp依次比較從小到大。
void InsertSort(int arr[],int n) { for (int i = 1; i < n; ++i) { for (int j = i; j > 0; --j) { if (arr[j] <arr[j - 1]) {int temp = arr[j]; //swap(arr[j],arr[j-1]); arr[j] = arr[j - 1]; arr[j - 1] = temp; } } } }
二、冒泡排序
大循環(i=0;i<n-1;i++)全遍歷;小循環(j=0;j<n-i;j++)對i以外的所有無序元素進行兩兩交換,相當於把最大(最小)那個元素慢慢排到最頂端,這個頂端就是i的有序區,下次j循環就不在排序有序區。
void BubbleSort(int arr[], intn) { 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; } } } }
修改:①不用對有序區進行叠代。②初始就是有序的話需要進行判斷。
①i不需要<n-1,只要小於有序區就可以,最開始的有序區即為n-1,用last代替,依次--。即i<last,有序區不再進行排序。當有序區lsat=0時退出叠代。
②如果初始就排序成功,則不用進行交換,使用一個標記flat,初始化為0,如果叠代一遍完成發現沒有交換操作則flat保持為0,並賦值給last,直接跳出叠代。若進行操作則flat賦值為i,令其無法等於0,防止意外跳出。
void BubbleSort(int arr[], int n) { int i, temp; int flat, last = n - 1; while (last > 0) { for (i = flat = 0; i <=last; ++i) { if (arr[i] < arr[i - 1]) { temp = arr[i]; arr[i] = arr[i - 1]; arr[i - 1] = temp; flat = i; } } last = flat; } }
三、快速排序
遞歸的思想,找到中值oncesort(),每次quicksort函數都包含一個找中值函數和兩個quicksort函數(分別為中值左右兩邊)。
找中值的思想:i在最左邊,j在最右邊,同時滿足i<j和arr[i]<arr[j]時,j慢慢左移,如果arr[i]>arr[j],則交換,同時變為i往右移動。直到不滿足i<j。return i 即為中值位置。
int OnceSort(int arr[], int first, int end) { int i = first; int j = end; while (i < j) { while (i < j&&arr[i] <= arr[j]) { j=j-1; } if (i < j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } while (i < j&&arr[i] <= arr[j]) { i=i+1; } 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 flat = OnceSort(arr, first, end); QuickSort(arr, first, flat - 1); QuickSort(arr, flat + 1, end); } }
四、堆排序
void Heapify(int arr[], int first, int end) { int father = first;; int son = 2 * father + 1; while (son < end) { if (son + 1 < end&&arr[son] < arr[son + 1]) { son = son + 1; } if (arr[father] > arr[son]) break; else { int temp = arr[son]; arr[son] = arr[father]; arr[father] = temp; father = son; son = 2 * father + 1; } } } void HeapSort(int arr[], int n) { for (int i = n / 2 - 1; i >= 0; --i) { Heapify(arr, i, n); } for (int i = n - 1; i > 0; --i) { int temp = arr[i]; arr[i] = arr[0]; arr[0] = temp; Heapify(arr, 0, i); } }
五、歸並排序
void Merge(int arr[], int reg[], int start, int end) { if (start >= end)return; int len = end - start, mid = (len >> 1) + start; int start1 = start, end1 = mid; int start2 = mid + 1, end2 = end; Merge(arr, reg, start1, end1); Merge(arr, reg, start2, end2); int k = start; while (start1 <= end1 && start2 <= end2) reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++]; while (start1 <= end1) reg[k++] = arr[start1++]; while (start2 <= end2) reg[k++] = arr[start2++]; for (k = start; k <= end; k++) arr[k] = reg[k]; } void MergeSort(int arr[], const int n) { int *reg=new int [n]; Merge(arr, reg, 0, n - 1); delete[] reg; }
主程序:數組的生成和排序顯示
#include "stdafx.h" #include<Sort.h> #include<cmath> #include<iostream> using namespace std; int main() { //////////************************原始數組創建******************************///////////////// int arr[50]; for (int i = 0; i < 50; i++) { arr[i]=(rand() % 50 + 1); } int num = sizeof(arr) / sizeof(int); //////////*****************************排序*************************///////////////// //InsertSort(arr,num); //BubbleSort(arr, num); //QuickSort(arr, 0, num - 1); //HeapSort(arr, num); //MergeSort(arr, num);; //////////********************************顯示**********************///////////////// for (int j = 0; j < num; j++) { cout << arr[j] << " "; } system("pause"); return 0; }
C++排序算法