朱琛的小屋

各种排序代码集合笔记

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include<stdio.h>

//直接插入排序
void InsertSort(int *datatemp,int n){
int *data = new int[n];
for(int i=0;i<n;i++){
data[i]=datatemp[i];
}
int temp,j;
for(int i=2;i<n;i++){
temp = data[i];
if(data[i]<data[i-1]){
j = i-1;
while(data[j]>temp){
data[j+1]=data[j];
j--;
}
data[j+1]=temp;
}
}
//输出
printf("直接插入排序:\t");
for(int i=1;i<n;i++){
printf("%d ",data[i]);
}
printf("\n");
}

//希尔排序
void ShellSort(int *datatemp,int n){
int *data = new int[n];
for(int i=0;i<n;i++){
data[i]=datatemp[i];
}
int dk = n/2;
while(dk>=1){
//插入排序了下面是
for(int i=dk;i<n;i+=dk){
int temp = data[i];
if(data[i]<data[i-dk]){
int j = i-dk;
while(data[j]>temp){
data[j+dk]=data[j];
j-=dk;
}
data[j+dk]=temp;
}
}
dk/=2;
}
//输出
printf("希尔排序:\t");
for(int i=1;i<n;i++){
printf("%d ",data[i]);
}
printf("\n");
}


//快速排序
int QsortThird(int low,int high ,int *data){
int temp = data[low];
while(low<high){
while(low<high && data[high]>=temp)high--;
data[low]=data[high];
while(data[low]<=temp && low<high) low++;
data[high]=data[low];
}
data[low]=temp;
return low;
}

void QsortSecond(int low,int high ,int *data){
if(low<high){
int mid = QsortThird(low,high,data);
QsortSecond(low,mid-1,data);
QsortSecond(mid+1,high,data);
}
}
void QsortFrist(int *datatemp,int n){
int *data = new int[n];
for(int i=0;i<n;i++){
data[i]=datatemp[i];
}
QsortSecond(1,n-1,data);
//输出
printf("快速排序:\t");
for(int i=1;i<n;i++){
printf("%d ",data[i]);
}
printf("\n");
}

//归并排序
void Merge(int *A,int low,int mid,int high,int *B){
int x=low,m=mid,y=mid+1,n=high;
int k=0;
while(x<=m && y<=n){
if (A[x] <= A[y]) B[k++]=A[x++];
else B[k++]=A[y++];
}
while(x<=m){
B[k++]=A[x++];
}
while(y<=n){
B[k++]=A[y++];
}
//把已经有序的序列再返回
for (int i = 0; i < k; i++)
A[low+i] = B[i];
}
void MergeSortSecond(int *A,int low,int high,int *B){
if(low<high){
int mid = (low+high)/2;
MergeSortSecond(A,low,mid,B);
MergeSortSecond(A,mid+1,high,B);
Merge(A,low, mid, high, B);
}
}

void MergeSortFirst(int *datatemp,int n){
int *data = new int[n];
for(int i=0;i<n;i++){
data[i]=datatemp[i];
}
int *datatmp = new int[n];
MergeSortSecond(data,1,n-1,datatmp);

//输出
printf("归并排序:\t");
for(int i=1;i<n;i++){
printf("%d ",data[i]);
}
printf("\n");
}

//堆排序
void HeapSort(){

}
int main(){
int data[8]={0,49,38,65,97,76,13,27};//后七个数是数据,第一个是哨兵,这里为了做例子才这么写
//输出
printf("原始数据:\t");
for(int i=1;i<8;i++){
printf("%d ",data[i]);
}
printf("\n");
InsertSort(data,8);
ShellSort(data,8);
QsortFrist(data,8);
MergeSortFirst(data,8);
return 0;
}

还没写完,有空把堆排序补上。

朱琛 wechat
扫一扫,用手机看更方便~
坚持原创技术分享,您的支持将鼓励我继续创作!