标签:and 包含 class ace pre 分代 rand 防止 The
参考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[], int n) { 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; }
标签:and 包含 class ace pre 分代 rand 防止 The
原文地址:https://www.cnblogs.com/Eumenides/p/9591702.html