基本排序实现

来源:互联网 发布:mysql建库指定字符集 编辑:程序博客网 时间:2024/06/05 18:26
//冒泡void sort_bubble(int* p, int n){for (int i = n - 1; i > 0; --i){for (int j = 0; j < i; ++j){if (p[j] < p[j + 1]){int b = p[j];p[j] = p[j + 1];p[j + 1] = b;}}}}//选择void sort_select(int* p, int n){for (int i = 0; i < n - 1; ++i){int j = i;for (int k = j + 1; k < n; ++k){if (p[k] > p[j])j = k;}if (j != i){int b = p[j];p[j] = p[i];p[i] = b;}}}//插入void sort_insert(int* p, int n){for (int i = 0; i < n - 1; ++i){//将p[i + 1]位置的数据插入到//p[0]~p[i]的排序数据组int j;for (j = 0; j <= i; ++j){if (p[i + 1] < p[j])break;}//如果p[i + 1]比p[0]~[i]的所有元素都大//那么这j最后是等于i + 1跳出的,如果j//等于i + 1则不进行插入if (j != i + 1){//得到插入的数据int b = p[i + 1];//得到要移动的次数int m = i + 1 - j;//插入for (int k = 0; k < m; ++k)p[i + 1 - k] = p[i - k];p[j] = b;}}}//快速排序void sort_quick(int* p, int b, int e){//快速排序有两个步骤//1)将当前数组的最左侧的元素放在该放的位置,//就是把当前数组中比最左侧小的元素放在它的//左边,比最左侧大的元素放在它的右边if (b >= e)return;//用i下标标记当前要放入的比p[b]小的元素的位置int i = b;//循环调整for (int j = b + 1; j <= e; ++j){if (p[j] < p[b]){i += 1;if (i != j){int c = p[j];p[j] = p[i];p[i] = c;}}}if (i != b){int c = p[b];p[b] = p[i];p[i] = c;}//2)把i左侧的部分和右侧的部分分别进行//递归处理sort_quick(p, b, i - 1);sort_quick(p, i + 1, e);}//归并void sort_merge(int* p, int b, int e, int* h){if (b >= e)return;//得到b、e的中间位置int m = (b + e) / 2;//递归左边的sort_merge(p, b, m, h);//递归右边的sort_merge(p, m + 1, e, h);//归并int i1 = b, i2 = m + 1, i3 = b;while (i1 <= m && i2 <= e){if (p[i1] < p[i2])h[i3++] = p[i1++];elseh[i3++] = p[i2++];}while (i1 <= m)h[i3++] = p[i1++];while (i2 <= e)h[i3++] = p[i2++];for (int i = b; i <= e; ++i)p[i] = h[i];}