ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C语言- 基础数据结构和算法 - 18 快速排序20220618

2022-06-18 19:35:39  阅读:173  来源: 互联网

标签:arr include temp 20220618 int 18 C语言 排序 tb


 C语言- 基础数据结构和算法 - 18 快速排序20220618.

听黑马程序员教程《基础数据结构和算法 (C版本)》,

照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1

喜欢的朋友可以去看看,欢迎大家一起交流学习。

18 快速排序20220618.c

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #include <time.h>
  5 #include <sys/timeb.h>
  6 
  7 /*
  8     快速排序:目前排序速度最快效率最高的排序算法。 
  9     分治法 + 挖坑填数
 10     分治法:大问题分解成各个小问题,对小问题求解,从而解决大问题。 分开处理。
 11     基准数,一般选择第一个数 arr[0]。 
 12 */ 
 13 
 14 #define MAX 100000
 15 
 16 
 17 long getSystemTime(){        // 取得当前系统时间 
 18     struct timeb tb;
 19     ftime(&tb);
 20     return tb.time*1000 + tb.millitm;
 21 }
 22 
 23 // 插入排序
 24 void InsertSort(int arr[],int lenght){
 25     
 26     int i,j;
 27     for(i=1;i<lenght;i++){
 28         
 29         if(arr[i] < arr[i-1]){
 30             int temp = arr[i];
 31             for(j=i-1;j>=0&& temp < arr[j];j--){
 32                 arr[j+1] = arr[j];
 33             }
 34             arr[j+1]= temp;
 35         }
 36     }
 37 } 
 38 // 打印函数
 39 void PrintArray(int arr[],int lenght){
 40     
 41     int i;
 42     for(i=0;i<lenght;i++){
 43         printf("%-3d ",arr[i]);
 44     }
 45     printf("\n-------------------------------------------------\n");
 46 }
 47 
 48 // 希尔排序(从小到大) 
 49 void ShellSort(int arr[],int lenght){
 50     
 51     // 分组的增量(分多少个组),先默认为lenght;
 52     int increaerment = lenght;
 53     
 54     int i,j,k; 
 55     do{
 56         // 确定分组的增量
 57         increaerment = increaerment / 3 + 1 ; 
 58         
 59         for(i=0;i<increaerment;i++){
 60             
 61             for(j=i+increaerment;j<lenght;j+=increaerment){
 62                 
 63                 if(arr[j] < arr[j-increaerment]) {
 64                     
 65                     int temp = arr[j];
 66                     for(k=j-increaerment;k>=0 && temp < arr[k];k-=increaerment){
 67                         arr[k+increaerment] = arr[k];
 68                     }
 69                     arr[k+increaerment] = temp;
 70                 }
 71             }
 72         }
 73         
 74     } while(increaerment > 1);        // 先执行上面的do,然后再判断,符合条件再继续执行。 
 75 } 
 76 
 77 // 快速排序(从小到大) 
 78 void QuickSort(int arr[],int start,int end){
 79     
 80     int i = start;
 81     int j = end;
 82     
 83     // 基准数。所有的数都与基准数进行比较。
 84     int  temp = arr[start];
 85     
 86     if(i<j){
 87         while(i<j){
 88             
 89             // 从右向左去找比基准数小的元素。
 90             while(i<j && arr[j]>=temp){
 91                 j--;
 92             }
 93             
 94             // 填坑
 95             if(i<j){
 96                 arr[i] = arr[j];
 97                 i++;
 98             } 
 99             
100             // 从左向右,找双基准数大的数
101              while( i<j && arr[i]< temp){
102                  i++;
103              } 
104             
105             // 填坑
106             if(i<j){
107                 arr[j] = arr[i];
108                 j--;
109             } 
110         }
111         
112         // 把基准数放到i或j(i已经等于j了)的位置
113         arr[i] = temp; 
114         
115         // 递归 对基准数左半部分进行快速排序
116         QuickSort(arr,start,i-1); 
117         // 递归,对右半部分进行快速排序
118         QuickSort(arr,i+1,end); 
119         
120     }
121 } 
122 int main(){
123     printf("好好学习,天天向上~!!\t\t\t 18 快速排序20220618\n\n");
124     
125     int arr[MAX],arr2[MAX],myArr[MAX];
126     
127     srand((unsigned int)time(NULL));        // 随机 
128     
129     int i;
130     for(i=0;i<MAX;i++){
131         int randNum= rand() % MAX; 
132         arr[i] = randNum;
133         //arr2[i] = randNum;
134         //myArr[i] = randNum;
135     }
136     
137     //printf("希尔排序前: ");
138     //PrintArray(arr,MAX);     
139     
140     //printf("希尔排序后: ");    
141     long tshell_start = getSystemTime();
142     ShellSort(arr,MAX);
143     long tshell_end=getSystemTime();
144     //PrintArray(arr,MAX);    
145     printf("希尔排序%d个元素所需时间(毫秒):%ld \n",MAX,tshell_end-tshell_start);
146     
147     //long tinsert_start = getSystemTime();
148     //InsertSort(arr2,MAX);
149     //long tinsert_end=getSystemTime();
150     //PrintArray(arr2,MAX);    
151     //printf("插入排序%d个元素所需时间(毫秒):%ld \n",MAX,tinsert_end-tinsert_start);
152     
153     int len = sizeof(myArr) / sizeof(int);
154     
155     //printf("快速排序前: ");
156     //PrintArray(myArr,len);
157     
158     //printf("快速排序后: ");
159     //long tQuick_start = getSystemTime();
160     //QuickSort(myArr,0,len-1);
161     //long tQuick_end=getSystemTime();
162     //printf("快速排序%d个元素所需时间(毫秒):%ld \n",MAX,tQuick_end-tQuick_start);
163     //PrintArray(myArr,len);
164     
165     printf("\n\n");
166     system("pause");
167     return 0;
168 }

 

标签:arr,include,temp,20220618,int,18,C语言,排序,tb
来源: https://www.cnblogs.com/stou/p/16389048.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有