1、 int j; for (int i = 1; i = 0 & iArrj tempI) iArrj + 1 = iArrj; j-; iArrj + 1 = tempI; / 二分查找插入排序。 / 在已排好序的序列中插入元素,插入位置通过二分查找获得。 public void InnerSort_BinaryInsert(int iArr) int pos; pos = FindInsertPosition(iArr, i - 1, tempI); /查找待插入位置 for (int j = i; j pos; j-) iArrj = iArrj - 1; iArrpos = tempI;
2、 / 二分查找确定待插入位置。给定数组endPos已排序序列末尾下标tempI待插入元素返回插入位置 private int FindInsertPosition(int iArr, int endPos, int tempI) int startPos = 0; int midPos; while (startPos endPos = midPos - 1; else startPos = midPos + 1; return startPos; / 希尔排序算法。 / 分组插入排序,按一定间隔先将序列分成n组,组内进行直接插入排序,再减小间隔直至1,完成排序。 public void In
3、nerSort_Shell(int iArr) int interval = len / 2; while (interval = 1) for (int i = interval; j = i - interval; iArrj + interval = iArrj; j -= interval; iArrj + interval = tempI; interval /= 2; / 选择排序算法。 / 每一次都是在待排序列中选出最小的元素,将其放置于有序序列之后。 public void InnerSort_Selection(int iArr) int min; for (int i =
4、0; pos = i; min = iArri; for (int j = i + 1; j j+) if (iArrj min) pos = j; min = iArrj; if (pos != i) Swap(iArr, pos, i); / / 交换数组中两个不同位置的元素。pos1待交换位置1pos2待交换位置2 1) ConstructMaxHeap(iArr, len - 1); /先将原数组构建成一个大顶堆 Swap(iArr, 0, len - 1); len - 2; AdjustMaxHeap(iArr, 0, len - 2 - i); /将数组剩余部分重新调整成大顶堆
5、Swap(iArr, 0, len - 2 - i); / 将给定元素序列构建成大顶堆。 / 从堆中最后一个元素的父节点开始调整,使该节点以下部分成为大顶堆,然后一直调整到根节点。lastPos待调整堆末尾位置= 0; i-) AdjustMaxHeap(iArr, i, lastPos); / 调整除堆顶位置外,其他位置均符合大顶堆性质的堆为大顶堆。startPos待调整堆起始位置 private void AdjustMaxHeap(int iArr, int startPos, int lastPos) int leftChild; int largePos; while (startP
6、os * 2 + 1 = lastPos) leftChild = startPos * 2 + 1; largePos = leftChild; if (leftChild + 1 = lastPos & iArrleftChild iArrleftChild + 1) largePos = leftChild + 1; if (iArrstartPos iArrj + 1) Swap(iArr, j, j + 1); isFinish = false; if (isFinish) */ int lastPos; int i = len - 1; while (i 0) lastPos =
7、0; lastPos = j; i = lastPos; / 快速排序算法。 / 先选择一个枢轴元素,以该元素为基准将序列划分成两部分,前半部分元素值均小于枢轴元素, / 后半部分均大于,然后递归处理前后两部分。 public void InnerSort_Quick(int iArr) QSort(iArr, 0, iArr.Length - 1); / 通过递归实现给定起始位置和末尾位置序列的快速排序。待排序起始位置待排序末尾位置 private void QSort(int iArr, int startPos, int endPos) if (startPos endPos) int
8、pivotPos = Partition(iArr, startPos, endPos); /进行一次划分 QSort(iArr, startPos, pivotPos - 1); QSort(iArr, pivotPos + 1, endPos); / 获取枢轴元素在序列划分后的位置。 / 划分过程中同时将相应元素进行移动,枢轴元素只在最终确实位置时移动。待划分序列起始位置待划分序列末尾位置返回枢轴量所处位置= tempI) endPos-; iArrstartPos = iArrendPos; iArrstartPos startPos+; iArrendPos = iArrstartPo
9、s; iArrstartPos = tempI; / 归并排序算法。 / 将待排序序列分成两个有序序列,进而合并两个有序序列为一个有序序列。 / 对于划分出的序列进行排序,可递归实现。 public void InnerSort_Merge(int iArr) MSort(iArr, 0, iArr.Length - 1); / 通过递归实现给定起始位置和末尾位置序列的归并排序。待排序序列起始位置待排序序列末尾位置 private void MSort(int iArr, int startPos, int endPos) int midPos = (startPos + endPos) /
10、2; MSort(iArr, startPos, midPos); MSort(iArr, midPos + 1, endPos); Merge(iArr, startPos, midPos, endPos); / 合并两个有序序列。第一个有序序列起始位置midPos第一个有序列末尾位置第二个有序序列末尾位置 private void Merge(int iArr, int startPos, int midPos, int endPos) int tempArr = new intendPos - startPos + 1; int pos = 0; int i = startPos; int j = midPos + 1; while (i = midPos & if (iArri = iArrj) tempArrpos = iArri; i+; tempArrpos = iArrj; j+; pos+;= midPos) while (j for (i = 0; iArrstartPos + i = tempArri;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1