各种排序的实现

来源:互联网 发布:校园二手网站 c 源码 编辑:程序博客网 时间:2024/05/23 23:38




/*****************************关于排序******************************************1.快速排序2.归并排序3.低排序4.基数排序5.希尔排序6.插入排序7.选择排序******************************************************************************//********************1.快速排序****************************思路:选择第一个元素为枢纽2.从最后遍历直到arr[i]<index,放到头元素,头指针后移3.从前遍历直到arr[i]>index,放到尾元素,尾指针前移4.把枢纽元放到头指针的空处,返回头指针的位置,方便子数组快排***********************************************************/void quickSort(int arr[],int start,int end);int Partition(int arr[],int start,int end);int Partition(int arr[],int start,int end){if(arr == NULL || start <0 || end<0)throw new std::exception("Invalid Numbers");int Index = arr[start];while(start < end){while(start <end &&arr[end] >Index)end--;arr[start++] = arr[end];while(start <end && arr[start]<Index)start++;arr[end--]=arr[start];}arr[start] = Index;return start;}//递归实现void quickSort(int arr[],int start,int end){if(start == end) return;if(start < end){int index =  Partition(arr,start,end);quickSort(arr,0,index-1);quickSort(arr,index+1,end);}}/***********************2.归并排序*******************************思路:3个过程,新建数组——划分——合并1.建一个辅助数组2.递归分解原数组,不断分成两部分3.合并数组,同时把合并排序后的元素放到辅助数组***********************************************************/void MergeSort(int arr[],int len);void mergesort(int arr[],int atmp[],int start,int end);void merge(int arr[],int atmp[],int start,int mid,int end);void MergeSort(int arr[],int len){int *atmp = new int[len];mergesort(arr,atmp,0,len-1);delete [] atmp;}void mergesort(int arr[],int atmp[],int start,int end){if(start < end){int mid = (start+end)/2;mergesort(arr,atmp,0,mid);mergesort(arr,atmp,mid+1,end);merge(arr,atmp,start,mid,end);}}void merge(int arr[],int atmp[],int start,int mid,int end){int i = start,j =mid+1;//先把元素放进辅助数组for(int k =start;k<end;k++)atmp[k] = arr[k];//之后按照排序从辅助数组中拷贝回原数组for(int k=start;k<end;k++){if(i>mid)//左半边存完了,mid之前的元素都已经存进了数组arr[k]=atmp[j++];else if(j>last)//右半边存完了arr[k]=atmp[i++];else if(atmp[i] < atmp[j])arr[k] = atmp[i++];elsearr[k] = atmp[j++];}}/***********************3.堆排序*******************************思路:3个过程,创建最大堆——最大推调整——堆排序1.最大堆调整:比较arr[i]和arr[2i+1]\arr[2i+2],调整然后继续down节点2.创建最大堆:层序放数,然后调整非叶子节点3.堆排序:不断把根节点和数组最后一个值交换,最大堆调整***********************************************************/void HeapSort(int arr[],int len);void MaxAdjust(int arr[],int i,int n);void HeapSort(int arr[],int len){for(int i = len/2-1;i>=0;i--)//创建大顶堆从最后一个非叶子节点进行堆调整MaxAdjust(arr,i,len);for(int i=len-1;i>=0;i--)//交换后不断剔除末节点{swap(arr[0],arr[i]);}}void MaxAdjust(int arr[],int i,int n){int largest = 0;int left = 2i +1;int right = 2i +2;if(left < n&&arr[left] > a[i])largest = left;else largest = i;if(right < n && a[right] >a[largest])largest =right;if(largest != i){swap(a[i],a[largest]);MaxAdjust(arr,largest,n);}}/***********************4.希尔排序*******************************思路:选步长不断进行比较,步长不断减半1.h=len/2作为初始步长,h不断折半,从h处元素不断和前边-h,-2h比较2.如果后边的元素小,则元素后移***********************************************************/void ShellSort(int arr[],int len){int j = 0;for(int h = len/2 ; h > 0;h /= 2)//每次步长减半{for(int i = h;i <len;i++)//从最后一段开始和前边比{int temp = arr[i];//存放待比较元素for(j=i; j>=h ; j-=h ;)//不断比较到第一段{if(temp < arr[j-h])arr[j] = arr[j-h];else break;}arr[j] = temp;//把不满足条件处的元素赋值为temp}}}/***********************5.直接插入排序*******************************思路:从第一个元素开始认为已排序1.双重循环,一个i++到len,一个j--到02.从a[j]开始依次和前边的元素a[j-1]比较,逆向比较***********************************************************/void InsertSort(int arr[],int len){for(int i =0;i<len;i++){for(int j =i;j>0;j--){if(arr[j]<arr[j-1])swap(arr[j],arr[j-1]);else break;}}}/***********************6.简单选择排序*******************************思路:从头到尾遍历,选一个小的交换一下,选一个交换一下,选一个交换一个***********************************************************/void SelectSort(int arr[],int n){for(int i =0;i<n;i++){int k =i;for(int j =i+1;j!=n;j++)//不断从后边选择最小的{if(arr[j]<arr[k])k=j;}if(k!=i)swap(arr[i],arr[k]);}}/***********************7.冒泡排序*******************************思路:不断交换两个数***********************************************************/void BubbleSort(int arr[],int n){for(int i =0;i<n;i++){for(int j =i+1;j!=n;j++)//不断从后边选择最小的{if(arr[j]<arr[i])swap(arr[i],arr[j]);}}}


0 0
原创粉丝点击