您的位置:首页 > 编程语言 > C语言/C++

常见的C++排序问题

2018-03-08 22:50 351 查看
上学期刚刚学完的数据结构 这学期我竟然把排序问题忘记的一干二净所以在这里要麻溜的复习一下常见的C++排序问题~常见排序算法 插入排序    直接插入排序                  折半插入排序                   希尔排序交换排序      冒泡排序                   快速排序选择排序     直接选择排序                   堆排序一、插入排序1、直接插入排序void InsertSort(int arr[], int len) {int i, j;int temp;for (i = 1; i < len; i++) {temp = arr[i];for (j = i - 1; j >= 0 && arr[j] > temp;j--)arr[j + 1] = arr[j];arr[j + 1] = temp;}}2、折半插入排序
typedef int datatype;
int BinaryInsertionSort(datatype *array, int size)
{
int i, j, low, high, mid;
int temp;

if(array == NULL) {
return -1;
}

for(i = 1; i < size; i++) {
low = 0;
high = i-1;
temp = array[i];

//跳出循环时low为插入位置
while(low <= high) {
mid = (low + high) / 2;
//若比中间记录小,则去左区间查找
if(array[mid] > temp) {
high = mid - 1;
} else {
//否则去右区间查找
low = mid + 1;
}
}

//将插入位置到待插入元素的位置上的元素整体向后移动一个位置
for(j = i; j > low; j--) {
array[j] = array[j-1];
}
array[low] = temp;
}

return 0;
}
3、希尔排序template <class T>void Shellsort(dataList<T>&L,const int left,const int right){int i,j,gap=right-left+1;Element<T> temp;do{gap=gap/3+1;for(i=left+gap;i<=right;i++){if(L[i]<L[i-gap]){temp=L[i];j=i-gap;do{L[j+gap]=L[j];j=j-gap;}while(j>=left&&temp<L[j]);L[j+gap]=temp;}}}while (gap>1);}二、交换排序1、冒泡排序void BubbleSort(int arr[], int len){int i,temp;//记录位置,当前所在位置和最后发生交换的地方int current,last = len - 1;while(last > 0) {for(i = current = 0;i < last;++i){if(arr[i] > arr[i+1]){temp = arr[i];arr[i] = arr[i+1];arr[i+1] = temp;//记录当前的位置,如果没有发生交换current值即for循环初始化的0current = i;}}//若current = 0即已经没有可以交换的元素了,即已经有序了last = current;}}2、快速排序void OnceSort(int arr[], int first, int end){int i = first,j = end;//当i<j即移动的点还没到中间时循环while(i < j){//右边区开始,保证i<j并且arr[i]小于或者等于arr[j]的时候就向左遍历while(i < j && arr[i] <= arr[j]) --j;//这时候已经跳出循环,说明j>i 或者 arr[i]大于arr[j]了,如果i<j那就是arr[i]大于arr[j],那就交换if(i < j){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}//对另一边执行同样的操作while(i < j && arr[i] <= arr[j]) ++i;if(i < j){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}//返回已经移动的一边当做下次排序的轴值return i;}三、选择排序1、直接选择排序2、堆排序//堆排序void HeapSort(int arr[],int len){int i;//初始化堆,从最后一个父节点开始for(i = len/2 - 1; i >= 0; --i){Heapify(arr,i,len);}//从堆中的取出最大的元素再调整堆for(i = len - 1;i > 0;--i){int temp = arr[i];arr[i] = arr[0];arr[0] = temp;//调整成堆Heapify(arr,0,i);}}void Heapify(int arr[], int first, int end){int father = first;int son = father * 2 + 1;while(son < end){if(son + 1 < end && arr[son] < arr[son+1]) ++son;//如果父节点大于子节点则表示调整完毕if(arr[father] > arr[son]) break;else {//不然就交换父节点和子节点的元素int temp = arr[father];arr[father] = arr[son];arr[son] = temp;//父和子节点变成下一个要比较的位置father = son;son = 2 * father + 1;}}}3、希尔排序二、交换排序1、冒泡排序2、快速排序三、选择排序1、直接选择排序2、堆排序
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: