排序算法复习之代码练习

先贴上代码,以后再慢慢分析。

  1 #include <time.h>
  2
  3 #define MAXSIZE 6000
  4 typedef struct List{
  5    int r[MAXSIZE];
  6    int length;
  7 }SqList;
  8
  9 void swap(SqList* L, int i, int j)
 10 {
 11     int temp = L->r[i];
 12     L->r[i] = L->r[j];
 13     L->r[j] = temp;
 14 }
 15
 16 void SampleSelectSort(SqList* L)
 17 {
 18     int i,j,min;
 19     for(i=0;i<L->length;i++){
 20         min = i;
 21         for(j=i+1;j<=L->length;j++)
 22         {
 23             if(L->r[min] > L->r[j])
 24                 min = j;
 25         }
 26         if(i!=min){
 27             swap(L,i,min);
 28         }
 29     }
 30 }
 31
 32 void MergeSort(SqList* L)
 33 {
 34     MSort(L->r,L->r,0,L->length-1);
 35 }
 36 void MSort(int SR[], int TR1[],int s, int t)
 37 {
 38     int m;
 39     int TR2[MAXSIZE];
 40     if(s == t)
 41         TR1[s] = SR[s];
 42     else{
 43         m = (s+t)/2;
 44         MSort(SR,TR2,s,m);
 45         MSort(SR,TR2,m+1,t);
 46         Merge(TR2,TR1,s,m,t);
 47     }
 48 }
 49
 50 void Merge(int SR[], int TR[], int s, int m, int n)
 51 {
 52     int i,j;
 53     for(i=s,j=m+1;i<=m && j<=n;s++){
 54         if(SR[i]<SR[j])
 55             TR[s] = SR[i++];
 56         else
 57             TR[s] = SR[j++];
 58     }
 59     int l;
 60     if(i<=m){
 61         for(l=i;l<=m;l++)
 62             TR[s++] = SR[l];
 63     }
 64
 65     if(j<=n){
 66         for(l=j;l<=n;l++)
 67             TR[s++] = SR[l];
 68     }
 69 }
 70 void InsertSort(SqList* L)
 71 {
 72     int i,j;
 73     int flag;
 74     for(i=1;i<L->length;i++)
 75     {
 76         if(L->r[i]<L->r[i-1]){
 77             flag = L->r[i];
 78             for(j=i-1;L->r[j]>flag;j--){
 79                 L->r[j+1] = L->r[j];
 80             }
 81             L->r[j+1] = flag;
 82         }
 83     }
 84 }
 85
 86 void HeapAdjust(SqList* L, int s, int n)
 87 {
 88     int temp,j,i;
 89     temp = L->r[s];
 90     for(j=2*s;j<n;j*=2){
 91         if(j<n && L->r[j] > L->r[j+1])
 92             j++;
 93         if(temp <= L->r[j])
 94             break;
 95         L->r[s] = L->r[j];
 96         s = j;
 97     }
 98     L->r[s] = temp;
 99 }
100
101 void HeapSort(SqList * L)
102 {
103     int i;
104     for(i=(L->length-1)/2-1;i>0;i--)
105     {
106         HeapAdjust(L,i,L->length-1);
107     }
108  for(i=0;i<L->length;i++){
109         printf("%d ",L->r[i]);
110     }
111     printf("\n");
112     for(i=L->length;i>2;i--){
113         swap(L,1,i-1);
114         HeapAdjust(L,1,i-2);
115     }
116 }
117 void ShellSort(SqList* L)
118 {
119     int i,j;
120     int step = L->length;
121     int flag;
122     do{
123         step = step/3 + 1;
124         for(i=step+1;i<L->length;i++){
125             if(L->r[i]<L->r[i-step]){
126                 flag = L->r[i];
127                 for(j=i-step;((j>0)&&(L->r[j]>flag)); j-=step){
128                     L->r[j+step] = L->r[j];
129                 }
130                 L->r[j+step] = flag;
131             }
132         }
133     }while(step>1);
134 }
135
136 void QuickSort(SqList*L)
137 {
138     QuickSortPart(L->r,0,L->length-1);
139 }
140
141 void QuickSortPart(int array[], int low, int high)
142 {
143     if(low < high){
144          int i = QuickArraySort(array,low,high);
145     QuickSortPart(array,low,i-1);
146     QuickSortPart(array,i+1,high);
147     }
148
149 }
150
151 int QuickArraySort(int array[],int low, int high)
152 {
153     int orig = array[low];
154     while(low<high){
155         while(low<high && array[high]>orig)
156             high--;
157         if(low<high){
158             array[low] = array[high];
159             low++;
160         }
161         while(low<high && array[low]<orig)
162             low++;
163         if(low<high){
164             array[high] = array[low];
165             high--;
166         }
167     }
168     array[low] = orig;
169     return low;
170 }
171
172 #define random(x) (rand()%x)
173
174 int main()
175 {
176     SqList* L;
177     int i;
178     srand(time(NULL));
179      int a[MAXSIZE];
180     for(i = 0; i < MAXSIZE; i++)
181         a[i] = random(2147483647);
182
183     L = (SqList *)malloc(sizeof(struct List));
184     L->length = MAXSIZE;
185     memcpy(L->r,a,MAXSIZE*sizeof(int));
186
187     MergeSort(L);
188
189     for(i=0;i<100;i++){
190        printf("%d ",L->r[i]);
191     }
192     printf("\n");
193     return 0;
194 }
时间: 2024-10-10 00:38:17

排序算法复习之代码练习的相关文章

C语言排序算法复习

排序算法有很多种,这里在复习和分析的基础上,做一个自己的总结: 首先要知道有哪些排序算法,google一下,有云C语言7大经典排序算法(也有8大).主要包括冒泡排序,快速排序,选择排序,插入排序,希尔排序,归并排序,堆排序,8大的还有基数排序.各有各的版本,代码写法也各不相同.所以这里以整理思路为先,代码只是作为自己的一个备份. 搞清楚的概念:稳定排序和不稳定排序,就看序列中两个值相等的数,排完序之后的相对位置是否改变,如果改变了就不稳定. 内部排序和外部排序,只用到内存即可完成排序的就叫内部排

排序算法复习

排序算法复习 作者:vpoet mails:[email protected] 注:转载请注明出处 #include <iostream> #include <windows.h> using namespace std; void Bubble_Sort(int UnSort[],int length); void Select_Sort(int UnSort[],int length); void Insert_Sort(int UnSort[],int length); vo

经典排序算法总结(代码) .(转)

经典排序算法总结(代码) ·冒泡法 ·快速排序 ·插入排序 ·希尔(shell)排序 ·选择排序 ·堆排序 ·归并排序   附: 排序算法原理:http://zh.wikipedia.org/wiki/Category:%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95 flash演示:http://www.tyut.edu.cn/kecheng1/site01/suanfayanshi/list.asp?id=7 归并排序的具体介绍在下面的文章里: 递归算法学习---归并

动画展现十大经典排序算法(附代码)

0.算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序. 0.2 算法复杂度 0.3 相关概念 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面. 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面.

十大排序算法(原理及代码实现细节)

本文参考一些书籍啊哈算法,数据结构与算法(清华大学),已经一些网上的博客 然后动图也是从网上偷来的(^_^),代码实现我尽量用大家容易懂的方式实现 数组居多,然后,桶排序(是别人代码,不过写的不完全正确后面会更新),都是学习嘛 有误的地方,还望各位指正,希望对你有帮助(其实很灵活的,在运用上),也不要这样就满足了 多多地运用,会使理解更深的. 按上面的顺序来吧 原理在代码里直接上动图吧 冒泡排序动图演示 冒泡排序代码实现 1 #include<iostream> 2 #include<c

Java排序算法 - 堆排序的代码

把内容过程中比较重要的一些内容片段做个备份,如下的资料是关于Java排序算法 - 堆排序的内容. import java.util.Arrays; public class HeapSort { int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51}; public HeapSort(){ heapSort(a); } public void heapSort(int[

排序算法复习:直接插入排序、堆排序、快排、冒泡排序

冒泡排序,感觉是最简单的排序: 基本思路:每次把数组中最小的一个元素像气泡一样浮动.固定到最顶端: 从前向后遍历数组,每次拿到一个元素,就执行一遍冒泡: 从数组末尾开始,到当前元素截止,从后向前遍历,每次比较数组中相邻的两个元素,如果后者比较小,就把两者互换. 这样经过第一次冒泡,可以把最小的元素『浮』到数组的首位.第二次冒泡会把第二小的元素『浮』到数组的第二位.直到所有的元素都被『浮动』到正确的位置. 代码极其简单: var BubbleSort = function (array) { va

鸽巢排序算法描述和代码举例

//鸽巢排序//适用条件:所有取值的范围确定,并且在这个范围内个元素的出现频率较高.//算法描述:为取值范围内的各个可能取到的元素建巢用一维数组表示,巢中//    巢中存放该元素出现的个数(通过遍历待排序数统计存入).按照巢的//    顺序和巢中元素个数列出该有序序列.//算法空间复杂度为:S(1)时间复杂度为:O(n). //例:20个非负数,其中每个数的取值范围为1~9. #include<iostream>#include<time.h>using namespace s

排序算法原理及代码实现(c#)

1.插入排序 把第一个元素看做已排序数组放在有序数组中,从第二个元素开始,依次把无序数组元素取出和有序数组中的元素逐个比较,并放在有序数组的正确位置上. /// <summary> /// C# 插入排序 List<i>为无序数组 List<j>为有序数组 把无序数组逐个跟前值比较后放在有序数组的正确位置上 /// </summary> public class InsertionSorter { public void Sort(int[] list) {