快速排序和归并排序算法


一、快速排序(quicksort)

#include <stdio.h>
#include <stdlib.h>
#pragma comment(linker, "/STACK:1073741824")

const int maxn=1000001;
int A[maxn];

void swap(int &a, int &b) {
  int c = a; a = b; b = c;
}

int partition(int arr[], int low, int high) {
swap(arr[low+rand()%(high-low+1)],arr[high]);//避免出现从小到大这种糟糕情况出现,降低时间复杂度
  int pivot = arr[high], i = low;
  for (int j = low; j < high; j++) {
    if(arr[j]<=pivot){
	swap(arr[i++],arr[j]);}//add something here
   }
swap(arr[i],arr[high]);
return i;
  //add something here
}

void quickSort(int arr[], int low, int high) {
  if (low < high) {
    int k = partition(arr, low, high);
    if(k!=low)quickSort(arr,low,k-1);
    if(k!=high)quickSort(arr,k+1,high);
  }  
 //add something here
//add something here
  
}

int main() {
  int n;
  scanf( "%d", &n);
  for (int i=0; i<n; i++) scanf("%d", &A[i]);

  quickSort(A, 0, n-1); //change this sentence注意上下标
  
  for (int i=0; i<n; i++) printf("%d ", A[i]);
  return 0; 
}

二、归并排序(mergesort)

#include<stdio.h>

const int maxn=1000001;
int A[maxn];

void merge(int arr[], int left, int middle, int right){
int i, j;
int n1=middle-left+1, n2=right-middle;
int L[n1], R[n2];
for(i=0;i<n1;i++) L[i]=arr[left+i];
for(j=0;j<n2;j++) R[j]=arr[middle+1+j];
int k=left;
i=0;j=0;
while(i<n1&&j<n2){//把两个序列sort成一个序列
	if(L[i]<=R[j]){
		arr[k++]=L[i++];
	}
else{
	arr[k++]=R[j++]}
}
while(i<n1)arr[k++]=L[i++];
while(j<n2)arr[k++]=R[j++];
   /* Please fill this part:
merge (L[0],...,L[n1-1])  with  (R[0],...,R[n2-1]) and store the result (in sorted order) in arr[left],...,arr[right]. */
}

void mergesort(int arr[],int left, int right){
if(left<right){
	int middle=(left+ right)/2;
	mergesort(arr,left,middle);
	mergesort(arr,middle+1,right);
	merge(arr,left,middle,right);
	//add something here. Think it by yourself}
}

 int main() {
  int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d", &A[i]);

	mergesort(A,0,n-1); //edit this sentence

for(int i=0;i<n;i++) printf("%d ", A[i]);
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值