快排笔记C++

单个有序快排 需要理解 然后改成通用的

1 4 7 8 3 6 9  以8为分界点

// 偶数会出现问题
void merge(int arr[],int length)
{   int i=0;//原数组指针位置
	int mid =length/2; //获取排序数组的中间位置
	int j=mid+1 ;//中间右边的位置
	int* temp  =new int[length];//创建和排序数组登场的空数组
	int k=0;//新建等长排序数组的指针位置
    
	while (i<=mid && k<=length) 
	{
		/*
		if (arr[i]<=arr[j])//加上等号 排序算法稳定
		{
			temp[k++]=arr[i++];
		}
		else{
         	temp[k++]=arr[j++];
		}
	    */

		arr[i]<=arr[j] ? temp[k++]=arr[i++] : temp[k++]=arr[j++];

	}

	while(i<=mid) //如果其中一个数组已经结束
		temp[k++]=arr[i++];
	while(j<=length)
		temp[k++]=arr[j++];


	for (int i=0;i<length;i++)//调试输出
	{
		printf("%d   ",temp[i]);
	}

}

  

快排源码

void MergeArray1(int array[], int start,int mid, int end , int temp[])
{
 int i=start;//原始数组最左边指针
 int j=mid+1;//分组后右边开始第一个
 int k=0;//新数组第一个位置指针

while(i<=mid && j<=end)  //原始数组左边小于中间 且 右边的小于 最右边边界
{
	if (array[i]<=array[j])
	{
		temp[k++]=array[i++];  //向数组中复制
	}else
	{
       	temp[k++]=array[j++];
	}

}
 while (i <= mid) {
        temp[k++] = array[i++];  //如果左边没有遍历完的情况下 直接复制过来 右边同理
    }
 while (j <= end) {   
        temp[k++] = array[j++];
    }
	 
	//数组拷贝   把temp 复制的arr里面去  但是这个临时数组每次都是从0开始的要注意  平时用不到最大最后一次才会用到最大
  for (int i = 0; i < k; i ++) {
        array[start + i] = temp[i];
  }


}


//递归 
void repeatCall(int arr[] ,int start,int end,int temparr[])
{
  
	if (start<end)
	{

     int mid=start+(end-start)/2; //固定写法
	 repeatCall(arr,start,mid,temparr);//左递归
     repeatCall(arr,mid+1,end,temparr);//右递归
	 MergeArray1(arr,start,mid,end,temparr);//合并
   
	}


}


int main(int argc, const char * argv[]) {
	// int aaa[]={1 ,4 ,7 ,8 ,3 ,6 ,9 ,10};
	 int array[] = {3,5,3,6,7,3,7,8,1};
     int temparr [9]={0};
     repeatCall(array,0,9,temparr);
	for (int i=0;i<9;i++)
	{
		printf("%d ",array[i]);
	}
    
    return 0;
}

  

原文地址:https://www.cnblogs.com/xuexidememeda/p/13502324.html