voidbubble_sort(T arr[], int len){ int i, j; for (i = 0; i < len - 1; i++) for (j = 0; j < len - 1 - i; j++) if (arr[j] > arr[j + 1]) swap(arr[j], arr[j + 1]);
2、选择排序
找到最小 和位置0换,找到次小,和位置1换
voidselection_sort(std::vector<T>& arr){ for (int i = 0; i < arr.size() - 1; i++) { int min = i; for (int j = i + 1; j < arr.size(); j++) if (arr[j] < arr[min]) min = j; std::swap(arr[i], arr[min]); } }
3、插入排序
一把牌,后面没排序的,一张张换到前面来。
voidinsertion_sort(int arr[],int len){ for(int i=1;i<len;i++){ int key=arr[i]; int j=i-1; while((j>=0) && (key<arr[j])){ arr[j+1]=arr[j]; j--; } arr[j+1]=key; } }
vector<int> sortArray(vector<int>& nums){ for ( int D = nums.size() / 2; D > 0; D /= 2 ) { for ( int i = D; i < nums.size(); i++ ) { int key = nums[i]; int j = i ; for ( ; j >= D && nums[j-D] >key; j -= D ) { nums[j] = nums[j-D]; } nums[j] = key; } } return nums; }
5、归并排序
1和2先排序,3和4排序,1234排序
vector<int> tmp; voidmergeSort(vector<int>& nums, int left, int right){ if (left >= right) return; int mid = (left + right) >> 1; mergeSort(nums, left, mid); mergeSort(nums, mid + 1, right); int i = left, j = mid + 1; int cnt = 0; while (i <= mid && j <= right) { if (nums[i] <= nums[j]) { tmp[cnt++] = nums[i++]; } else { tmp[cnt++] = nums[j++]; } } while (i <= mid) { tmp[cnt++] = nums[i++]; } while (j <= right) { tmp[cnt++] = nums[j++]; } for (int i = 0; i < right - left + 1; ++i) { nums[i + left] = tmp[i]; } }
6、堆排序
voidmaxHeapify(vector<int>& nums, int i, int end){ // 和子比 大子往上 一步步循环往下 for ( ; i * 2 + 1 <= end; ) { int leftSon = 2 * i + 1; int rightSon = 2 * i + 2; int large = i; if ( leftSon <= end && nums[leftSon] > nums[i] ) large = leftSon; if ( rightSon <= end && nums[rightSon] > nums[large] ) large = rightSon; if ( large != i ) { swap( nums[i], nums[large] ); i = large; } elsebreak; } }
voidheapSort(vector<int>& nums, int len){ for ( int i = (len - 1) / 2 ; i >= 0; i-- ) // 从最后一个父节点(独生子也行)开始往回 maxHeapify(nums, i, len - 1); // 最大值在最上 for ( int i = len - 1; i >= 1; i-- ) { swap( nums[i], nums[0] ); len -= 1; maxHeapify(nums, 0, len - 1); } }
7、快速排序
vector<int> sortArray(vector<int>& nums){ quickSort( nums, 0, nums.size() - 1 ); return nums; } voidquickSort(vector<int>& nums, int left, int right){ if ( left < right ) { int randVal = rand() % ( right - left + 1 ) + left; swap( nums[randVal], nums[right] );
int pivot = nums[right]; int i = left - 1; for ( int j = left; j < right; j++ ) { if ( nums[j] < pivot ) { //j遇小则换 i = i + 1; swap( nums[j], nums[i] ); } } swap( nums[right], nums[i+1] ); int pos = i + 1;