数据结构之各种排序

这篇博客分享了关于排序的有趣内容,推荐了一则相关视频,并且作者参照某资源重新实现了大顶堆数据结构。
摘要由CSDN通过智能技术生成

 

数据结构复习中,书上各种排序代码敲一遍,加深印象!
 
#include<stdio.h>
#include<stdlib.h>
#define N 1000

int a[N+1];

void swap(int &a, int &b){
	int temp;
	temp=b;;
	b=a;
	a=temp;
}
void print(int a[], int n){
    for(int i=1;i<n;i++)
        printf("%d ",a[i]);
    printf("%d\n",a[n]);
}



void updata(int a[], int n){
    int i;
    for(i=1;i<=n;i++){
        a[i]=rand()%100;
    }
}
//插入排序 
void insertSort(int a[],int n){
    int i,j;
    for(i=2;i<=n;i++){
        if(a[i]<a[i-1]){
            a[0]=a[i];
            for(j=i-1;a[0]<a[j];j--){
                a[j+1]=a[j];
            }
            a[j+1]=a[0];
        }
    }
}
//折半插入排序 
void binSort(int a[], int n){
    int i,j,low,high,mid;
    for(i=2;i<=n;i++){
        if(a[i]<a[i-1]){
            a[0]=a[i];
            low=1,high=i-1;
            while(low<=high){
                mid=(low+high)/2;
                if(a[mid]>a[0]) high=mid-1;
                else low=mid+1;
            }
            for(j=i-1;j>=high+1;j--)
                a[j+1]=a[j];
            a[high+1]=a[0];
        }
    }
}
//下面是希尔排序 
void shellSort(int a[], int n){
    int i,j,dk;
    for(dk=n/2;dk>=1;dk=dk/2){
        for(i=dk+1;i<=n;i++){
            if(a[i]<a[i-dk]){
                a[0]=a[i];
                for(j=i-dk;j>0&&a[0]<a[j];j-=dk)//这里a[0]不是哨兵,只是暂存元素 
                    a[j+dk]=a[j];
                a[j+dk]=a[0];
            }
        }
    }
}
//下面是冒泡排序 
void bubbleSort(int a[], int n){
	int i,j,flag;
	for(i=1;i<n;i++){
		flag=0;
		for(j=n;j>i;j--){
			if(a[j-1]>a[j]){
				swap(a[j-1],a[j]);
				flag=1;
			}
		}
		if(flag==0) return;
	}
}

//下面是快速排序 
int partion(int a[], int low, int high){
    // 选取第一个作为中轴
    a[0]=a[low];
    while(low<high){
        while(low<high&&a[high]>=a[0]) high--;
        a[low]=a[high];
        while(low<high&&a[low]<=a[0]) low++;
        a[high]=a[low];
    }
    a[low]=a[0];
    // 此时,low=high,表示中轴的位置
    return low;
}
void quickSort(int a[], int low, int high){
	if(low<high){
		int por=partion(a,low,high);
		quickSort(a,low,por-1);
		quickSort(a,por+1,high);
	}
}
//简单选择排序
void selectSort(int a[], int n){
    for(int i=1,min;i<=n;i++){
        min=i;
        for(int j=i+1;j<=n;j++){
            if(a[j]<a[min]) min=j;
        }
        if(i!=min) swap(a[i],a[min]);
    }
} 
//下面是堆排序
void adjustDown(int a[], int k, int len){
	a[0]=a[k];
	for(int i=2*k;i<=len;i*=2){
		if(i<len&&a[i]<a[i+1])
			i++;
		if(a[0]>=a[i]) break;
		else{
			a[k]=a[i];
			k=i;
		}
	}
	a[k]=a[0];
}
void buildheap(int a[], int len){
	for(int i=len/2;i>0;i--)
		adjustDown(a,i,len);
}
void heapSort(int a[], int len){
	buildheap(a,len);
	for(int i=len;i>1;i--){
		swap(a[1],a[i]);
		adjustDown(a,1,i-1);//整理,把剩余的i-1个元素整理成堆
	}
}

int main(){
    int i,j,n=15;
    printf("直接插入排序:\n");
    updata(a,n);
    print(a,n);
    insertSort(a,n);
    print(a,n);
    printf("折半插入排序:\n");
    
    updata(a,n);
    print(a,n);
    binSort(a,n);
    print(a,n);
    
    printf("希尔排序:\n");
    updata(a,n);
    print(a,n);
    shellSort(a,n);
    print(a,n);

	printf("冒泡排序:\n");
    updata(a,n);
    print(a,n);
    bubbleSort(a,n);
    print(a,n);
    
    printf("快速排序:\n");
    updata(a,n);
    print(a,n);
    quickSort(a,1,n);
    print(a,n);
    
    printf("简单选择排序:\n");
    updata(a,n);
    print(a,n);
    selectSort(a,n);
    print(a,n);

	printf("堆排序:\n");
    updata(a,n);
    print(a,n);
    heapSort(a,n);
    print(a,n);
    
    
    system("pause");
    return 0;
}


这里有一个关于排序的好玩的视频,大家可以看一下。http://www.guokr.com/post/482666/

 

参照https://www.jianshu.com/p/6374b5ec8494 重新实现了一个大顶堆对象。

# include<iostream>
# include<assert.h>
template <typename Item>
class MaxHeap{
public:
	MaxHeap(int capacity) {
		data = new Item[capacity];
		count = 0;
		this->capacity = capacity;
	}
	
	MaxHeap(int a[], int n) {
		data = new Item[n + 1];
		for (int i=0; i < n; i ++) {
			data[i + 1] = a[i];
		}
		count = n;
		capacity = n;
		for(int i = count/2; i >= 1; i--) {
			shifDown(i);
		}
	}
	~MaxHeap() {
		delete data;
	}
	
	void insert(Item x) {
		assert(count < capacity);
		data[count + 1] = x;
		count += 1;
		shifUp(count);
	}
	
	Item popTop() {
		assert(count >= 1);
		Item popItem = data[1];
		swap(data[1], data[count]);
		count -= 1;
		shifDown(1);
		return popItem;
	}
	
	void getTop() {
		return data[1];
	}
	
	bool isEmpty() {
		return count == 0;
	}
	
	int size() {
		return count;
	}
	
	void printData() {
		for (int i=1; i<= count; i++) {
			std::cout<< data[i] << " ";
		}
		std::cout<<"\n";
	}

private:
	Item * data;
	int count;
	int capacity;
	void swap(Item &a, Item &b) {
		Item tmp = b;
		b = a;
		a = tmp;
	}

    // 从节点k开始往上调整,大数上浮。
	void shifUp(int k) {
		while(k > 1 && (data[k] > data[k/2])) {
			swap(data[k], data[k/2]);
			k = k/2;
		}
	}
	// 其实就是,从某个节点开始,往下调整(小数下沉)操作,下沉时比较左右两个子节点哪个更大,则和父节点交换
	void shifDown(int k) {
		while(2*k <= count) {
			int j = 2*k;
			if (j+1 <= count && data[j] < data[j+1]) {
				j += 1;
			}
			if (data[k] >= data[j]) {
				break;	
			}
			swap(data[k], data[j]);
			k = j;
		}
	}
};

int main() {
	int arr[] = {6,3,8,9,2,99,12};
//	assert(1<0);
	MaxHeap<int> maxHeap = MaxHeap<int>(arr, sizeof(arr) / sizeof(arr[0]));
//	std::cout<< sizeof(arr[0]) <<std::endl;
	maxHeap.printData();
	while(!maxHeap.isEmpty()) {
		std::cout<<maxHeap.popTop()<<std::endl;
	}
	system("pause");
	return 0;
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值