几种排序算法
标签:插入 namespace div name using nbsp 一段 main quic
1 /*
2 线性表的排序算法
3 cza
4 2020/7/1
5 */
6 #include 7 #include 8 int num[100];
9 using namespace std;
10
11 int getMix(int left,int right){//找到left到right这一段数据中的最小值
12 int mixn=left;
13 for(int i=left;i){
14 if(num[i]num[mixn]){
15 mixn=i;
16 }
17 }
18 return mixn;
19 }
20
21 void select_sort(int left,int right){//选择排序
22 int flag=getMix(left,right);
23 int temp=num[flag];
24 num[flag]=num[left];
25 num[left]=temp;
26 left+=1;
27 if(left==right)
28 return;
29 else
30 select_sort(left,right);//不是循环,从递归调用出来就return
31 //return;
32 }
33
34 void bubble_sort(int left,int right){
35 int temp;
36 for(int i=left;i1;i++){//这里应该是right-1,如果是right的话i+1会发生“越界”
37 if(num[i]>num[i+1])
38 {
39 temp=num[i];
40 num[i]=num[i+1];
41 num[i+1]=temp;
42 }
43 }
44 right-=1;
45 if(left==right)
46 return;
47 else
48 bubble_sort(left,right);
49 }
50
51 void insert_sort(int left,int ordered,int right){//插入排序,
52 int in_place;
53 for(in_place=left;num[in_place]1];in_place++);
54 int temp=num[ordered+1];
55 for(int i=ordered+1;i>in_place;i--){
56 num[i]=num[i-1];
57 }
58 num[in_place]=temp;
59 ordered+=1;
60 if(ordered==right-1)//左闭右开时是right-1,闭区间时是right
61 return;
62 else
63 insert_sort(left,ordered,right);
64 }
65 void shell_sort(int left,int right){
66 int i,j,k,temp,gap;
67 int len=right-left;//左闭右开不用加一
68 for(gap=len/2;gap>0;gap/=2){//初始步长为数组长度的一半,每次遍历后步长减小为原来的一半
69 for(i=left;i//变量i为每次分组的第一个元素的下标
70 for(j=i+gap;jgap){
71 temp=num[j];
72 k=j-gap;
73 while(k>=left&&num[k]>temp){//向前找,直接插入排序
74 num[k+gap]=num[k];
75 k-=gap;
76 }
77 num[k+gap]=temp;
78 }
79
80 }
81 }
82 }
83 int getMin(int a,int b){
84 if(areturn a;
85 else return b;
86 }
87 void merge_sort(int left,int right){//归并排序
88 if((right-left)>2){
89 merge_sort(left,(left+right)/2);
90 merge_sort((left+right)/2,right);
91 }
92 int right_pointer=(left+right)/2;
93 int left_pointer=left;
94 int temp[100];
95 int i=left;
96 while(left_pointer2&&right_pointerright){
97 int m=getMin(num[left_pointer],num[right_pointer]);
98 temp[i]=m;
99 if(num[right_pointer]==m) right_pointer+=1;
100 else left_pointer+=1;
101 i+=1;
102 }
103 if(!(right_pointerright)){
104 while(iright){
105 temp[i]=num[left_pointer];
106 i+=1;
107 left_pointer+=1;
108 }
109 }else{
110 while(iright){
111 temp[i]=num[right_pointer];
112 i+=1;
113 right_pointer+=1;
114 }
115 }
116 for(int j=left;j){
117 num[j]=temp[j];
118 }
119 }
120
121 void quick_sort(int left,int right){//快速排序
122 if(right-left1) return;
123 int pointer=left;
124 for(int i=left+1;i){
125 if(num[i]num[pointer]){
126 int temp=num[i];
127 for(int j=i;j>pointer;j--){
128 num[j]=num[j-1];
129 }
130 num[pointer]=temp;
131 pointer+=1;
132 }
133 }
134 quick_sort(left,pointer+1);
135 quick_sort(pointer+1,right);
136 }
137 int main()
138 {
139 int n;
140 cin>>n;
141 for(int i=0;i){
142 cin>>num[i];
143 }
144 //select_sort(0,n);
145 //bubble_sort(0,n);
146 //insert_sort(0,0,n);
147 //shell_sort(0,n);
148 //merge_sort(0,n);
149 quick_sort(0,n);
150 for(int i=0;i){
151 cout" ";
152 }
153 }
几种排序算法
标签:插入 namespace div name using nbsp 一段 main quic
原文地址:https://www.cnblogs.com/za-chen/p/13545329.html
文章来自:
搜素材网的
编程语言模块,转载请注明文章出处。
文章标题:
几种排序算法
文章链接:http://soscw.com/index.php/essay/70750.html
评论