Bootstrap

数据结构复习--排序

1插入排序

每次把无序序列的一个元素插入到有序序列中,{3,2,1,9,4}->{2,3,1,9,4}->{1,2,3,9,4}->{1,2,3,9,4}->{1,2,3,4,9}

void insertsort(int a[],int n){
    int temp,i,j;
    for(i=0;i<n;i++){
        temp=a[i];//每次判断temp
        j=i-1;
        while(j>=0&&a[j]>temp){//大于temp后移一个位置
            a[j+1]=a[j];
            j--;
        }
        a[j+1]=temp;//插入
    }
}

2选择排序

每次遍历无序序列找到最小的那个值移到最前面

void selectsort(int a[],int n){
    int i,j,k;
    int temp;
    for(int i=0;i<n;i++){
        k=i;//k来存储最小值位置,a[k]为最小值
        for(int j=i+1;j<n;j++){
            if(a[k]>a[j]) k=j;//找到最小值
            temp=a[i];//交换a[i]和a[k]
            a[i]=a[k];
            a[k=temp];

        }
    }
}

3冒泡排序

void popsort(int a[],int n){
    for(int i=0;i<n-1;i++){
        for(int j=0;j<=n-1-i;j++){
            if(a[j]<a[j-1]){
                int temp=a[j];
                a[j]=a[j-1];
                a[j-1]=temp;
            }
        }
    }
}

4希尔排序

取增量k,比较a[i]和a[i+k],变增量,再比较,最后一步增量为1

void shellsort(int a[],int n){
    int temp;
    for(int gap=n/2;gap>0;gap/=2){//第一个增量n/2,每次/2作为下一个增量
        for(int i=gap;i<n;i++){
            temp=a[i];
            int j;
            for(j=i;j>=gap&&a[j-gap]>temp;j-=gap){//每次i都要与前面的i-整数个gap比较
                a[j]=a[j-gap];//大则后移
            }
            a[j]=temp;//插入

        }
    }
}

5快速排序

选取一个轴值,先和第一个值交换位置,开始比较,每一趟都找到一个值的正确位置

手写划分:

int Partition(int L[], int s, int t) {
	int temp = L[s];
	int low = s, high = t;
	while (low <  high) {
		while (L[high] > temp)
			high--;
		L[low] = L[high];
		while (L[low] < temp)
			low++;
		L[high] = L[low];
	}
	L[low] = temp;
	return low;
}
int QSort(int L[], int s, int t) {
	if (s >= t)
		return 0;
	int k = Partition(L, s, t);
	QSort(L, s, k - 1);
	QSort(L, k + 1, t);
	return 0;
}
int QuickSort(int L[], int n) {
	return QSort(L, 0, n - 1);
}

6堆排序

大根堆(节点>孩子)小根堆(节点<孩子),若不是,则调整(从n/2向下取整-1的节点开始调整)

插入:插入的节点加到最后,重新调整堆

删除:最后一个节点值移到删除节点的位置,重新调整

有序序列:拿出堆顶值,重新调整往复

7归并排序


void mergesort(int a[],int low,int high){
    int mid=(low+high)/2;
    if(low<high){
        mergesort(a,low,mid);
        mergesort(a,mid+1,high);
        merge(a,low,mid,high);
    }
}
void merge(int a[],int low,int mid,int high){//low到mid和mid+1到high两个有序表合并
    int i,j,k=low;
    int *b=new int[high-low+1];
    for(k=low;k<=high;k++){
        b[k]=a[k];
    }
    k=low;
    for(i=low,j=mid+1;i<=mid&&j<=high;k++){
        if(b[i]<=b[j]){
            a[k]=b[i++];
        }
        else a[k]=b[j++];
    }
    while(i<=mid){
       a[k++]=b[i++];
    }
    while(j<=high){
        a[k++]=b[j++];
    }
}

;