数据结构复习中,书上各种排序代码敲一遍,加深印象!
#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;
}