好家伙,写作业
(资料图片)
1.直接插入排序
这是个非常简单的排序
将一串数分为有序区和无序区
然后将无序区的数一个个按照正确的顺序放到有序区
2.归并排序
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
若将两个有序表合并成一个有序表,称为二路归并。
其中我们要解决的一个关键问题就是:
如何将两个有序序列合并成一个有序序列?
现在我们假设两个有序序列R[low]~[mid]、R[mid+1]~R[high]
void Merge(list R,list R1,int low,int mid,int high) {//合并R[low]~[mid]、R[mid+1]~R[high],结果在R1中 int i,j,k; i=low; j=mid+1; k=low; while(i<=mid && j<=high) { if(R[i]<=R[j]){ R1[k]=R[i]; i++; }//小者先入 else{ R1[k]=R[j]; j++; } } while(i<=mid) R1[k++]=R[i++];//复制左子表剩余 while(j<=high)) R1[k++]=R[j++];//复制右子表剩余}
作业题目如下:
对于给定的一组关键字:503,87,512,61,908,170,897,275,653,462,
请首先分别写出运用直接插入排序得到的每趟的结果。然后运用代码实现归并排序。
代码如下:
#includeusing namespace std;//归并排序 void mergeArr(int arr[], int low, int mid, int hight) { int* tempArr = new int[hight - low + 1]; int i = low, j = mid + 1, k = 0; while (i <= mid && j <= hight) { if (arr[i] < arr[j]) { tempArr[k] = arr[i]; i++; } else { tempArr[k] = arr[j]; j++; } k++; } // 如果 arr[low] 到 arr[mid] 区间中的数组还没有比较完成 ,直接复制到tempArr 中 while (i <= mid) { tempArr[k] = arr[i]; i++; k++; } // 如果 arr[mid+1] 到 arr[hight] 区间中的数组还没有比较完成 ,直接复制到tempArr 中 while (j <= hight) { tempArr[k] = arr[j]; j++; k++; } // 比较完成之后 将原本的数组arr 下标 low-hight 对应的内容 进行改变 i = low; for (int tempK = 0;((tempK < k)&&(i<=hight));tempK++) { arr[i] = tempArr[tempK]; i++; } delete[] tempArr; tempArr = NULL; }void sortArr(int arr[], int low, int hight) { if (low < hight) { int mid = (hight + low) / 2; sortArr(arr,low,mid);// 递归拆解左边的序列 sortArr(arr, mid + 1, hight);// 递归拆解左边的序列 mergeArr(arr, low, mid, hight);// 将两个有序的子序列(arr[low至mid]、arr[mid+1至hight] 排序合并成一个新的有序列 }}//直接插入排序 void InsertSort(int a[],int l){ int temp; int j; cout<<"直接插入排序每次排序后数据如下:" < =0&&temp