Code(一)排序算

来源:互联网 发布:mac迅雷下到46没速度 编辑:程序博客网 时间:2024/06/05 06:10

        更正1:

       快速排序算法,切分函数勘误,错误源自《算法 第4版》,当待排序列无重复元素时,该错误不会显现,但是当出现重复元素时,有可能会出现死循环。

        向下不满足数据和向上不满足数据,在交换位置后,应该对索引进行更新;否则由于重复元素的存在,交换的数据和枢轴数据相同,交换后,两边数据依旧不满足,索引不会更新,将会陷入死循环。

        更正2:

        insert_sort,可以提前break

#include<iostream>using namespace std;void swap(int &a, int &b){int temp;temp = a;a = b;b = temp;}void sort_select(int *vec, int len)   //选择排序 {if (len <= 1) return;for (int i = 0; i < len - 1; i++){int min = i;for (int j = i + 1; j < len; j++){if (vec[j] < vec[min]){min = j;}}swap(vec[i], vec[min]);}}void sort_insert(int *vec, int len)   //插入排序{if (len <= 1) return;for (int i = 1; i < len; i++){for (int j = i; j>0; j--){if (vec[j] < vec[j - 1])  swap(vec[j], vec[j - 1]);else break; //添加上,可以提高效率}}}int partition(int *vec, int lo, int hi){int value = vec[lo];int i = lo + 1;int j = hi;while (true){while ((vec[i] < value) && (i < hi))  { i++; }while ((vec[j]>value) && (j>lo)) { j--; }if (i >= j) { break; }swap(vec[i], vec[j]);i++;  // 更新操作j--;  // 更新操作}swap(vec[lo], vec[j]);return j;}void sort_quick(int *vec, int lo, int hi)  //快速排序{if (hi <= lo)  return;int j = partition(vec, lo, hi);sort_quick(vec, lo, j - 1);sort_quick(vec, j + 1, hi);}int main(){int a[9] = { 2, 4, 5, 2, 8, 19, 4, 11, 43 };for (int i = 0; i < 9; i++){cout << a[i] << ' ';}cout << endl;//sort_select(a,9);//sort_insert(a,9);sort_quick(a, 0, 8);for (int i = 0; i < 9; i++){cout << a[i] << ' ';}system("pause");return 0;}