黑马程序员C语言教程:C++培训专家:常用10大排序算法--希尔排序

合集下载

C语言--常见排序算法

C语言--常见排序算法
25 1 i k
49
2 j 49
08
0
25* 3 49 25
16 4
21
5
08
25
25*
16
21
i k 49
j 25* 25
08
25
25*
16
21
算法实例:
1.1.5 选择排序
49 2
08 0
25 1 i
25* 3
16 4 k
21 5 j 21 16
k 指示当前序列中最小者
算法实现:
08 5 temp
16 21 25 25* 49 08 0 1 2 3 4 5
算法实现:
1.1.3 直接插入排序
void InsertSort (int r[ ], int n ) { // 假设关键字为整型,放在向量r[]中 int i, j, temp; for (i = 1;i< n;i++ ) { temp = r[i]; for(j = i;j>0;j- -) {//从后向前顺序比较,并依次后移 if ( temp < r[j-1] ) r[j] = r[j-1]; else break; } r[j] = temp; } }
输入n 个数给a[1] 到 a[n]
for j=1 to n-1
for i=1 to n-j
真 a[i]>a[i+1]
a[i]a[i+1]
输出a[1] 到 a[n]
main() { int a[11],i,j,t; printf("Input 10 numbers:\n"); for(i=1;i<11;i++) scanf("%d",&a[i]); printf("\n"); 假 for(j=1;j<=9;j++) for(i=1;i<=10-j;i++) if(a[i]>a[i+1]) {t=a[i]; a[i]=a[i+1]; a[i+1]=t;} printf("The sorted numbers:\n"); for(i=1;i<11;i++) printf("%d ",a[i]); }

10个经典的C语言基础算法及代码

10个经典的C语言基础算法及代码

10个经典的C语言基础算法及代码1.冒泡排序算法冒泡排序是一种简单但效率较低的排序算法,在每一轮遍历中比较相邻的两个元素,如果顺序不正确则交换它们,直到整个数组有序为止。

```cvoid bubbleSort(int arr[], int n)for (int i = 0; i < n-1; i++)for (int j = 0; j < n-1-i; j++)if (arr[j] > arr[j+1])int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}```2.选择排序算法选择排序是一种简单直观的排序算法,它每次从待排序的数组中选择最小(或最大)的元素,并放到已排序的数组末尾。

```cvoid selectionSort(int arr[], int n)for (int i = 0; i < n-1; i++)int min_index = i;for (int j = i+1; j < n; j++)if (arr[j] < arr[min_index])min_index = j;}}int temp = arr[i];arr[i] = arr[min_index];arr[min_index] = temp;}```3.插入排序算法插入排序的基本思想是将数组分为已排序和未排序两部分,每次将未排序的元素插入到已排序的合适位置。

```cvoid insertionSort(int arr[], int n)for (int i = 1; i < n; i++)int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key)arr[j+1] = arr[j];j--;}arr[j+1] = key;}```4.快速排序算法快速排序使用分治法的思想,每次选择一个基准元素,将小于基准的元素放到左边,大于基准的元素放到右边,然后递归地对左右两个子数组进行排序。

十大排序算法总结

十大排序算法总结

十大排序算法总结在计算机科学领域,排序算法是一个非常重要的研究方向。

排序算法可以帮助我们更快速、更有效率地处理大量数据。

在本文中,我们将介绍十大常见的排序算法,包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序。

1. 冒泡排序冒泡排序是一种基本的排序算法。

它重复地遍历待排序的序列,一次比较两个元素,如果它们的顺序错误就交换位置,直到整个序列有序为止。

冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1)。

2. 选择排序选择排序是一种简单直观的排序算法。

它的工作原理是:首先在未排序的序列中找到最小元素,然后将其放到序列的起始位置;接着从剩余未排序的元素中继续寻找最小的元素,然后放到已排序序列的末尾。

选择排序的时间复杂度为O(n^2),空间复杂度为O(1)。

3. 插入排序插入排序是一种基本的排序算法。

它的工作原理是:将一个元素插入到已经排好序的序列中,使得插入后的序列仍然有序。

插入排序的时间复杂度为O(n^2),空间复杂度为O(1)。

4. 希尔排序希尔排序是一种改进版的插入排序。

它通过比较距离较远的元素,可以快速地将大元素向右移动,从而减少后续排序的比较次数。

希尔排序的时间复杂度为O(nlogn),空间复杂度为O(1)。

5. 归并排序归并排序是一种分治算法。

它将待排序的序列分成若干个子序列,每个子序列都是有序的。

然后再将有序的子序列合并成最终的有序序列。

归并排序的时间复杂度为O(nlogn),空间复杂度为O(n)。

6. 快速排序快速排序是一种基于分治思想的排序算法。

它通过不断地将序列分成两个部分,将较小的元素移动到左边、较大的元素移动到右边,最终将整个序列排好序。

快速排序的时间复杂度为O(nlogn),空间复杂度为O(nlogn)。

7. 堆排序堆排序是一种基于堆的排序算法。

它将待排序的序列看成一棵完全二叉树,每个节点的值都不大于其父节点的值。

然后将最大值不断地从堆中取出,放到已排序序列的末尾。

排序算法十大经典方法

排序算法十大经典方法

排序算法十大经典方法
排序算法是计算机科学中的经典问题之一,它们用于将一组元素按照一定规则排序。

以下是十大经典排序算法:
1. 冒泡排序:比较相邻元素并交换,每一轮将最大的元素移动到最后。

2. 选择排序:每一轮选出未排序部分中最小的元素,并将其放在已排序部分的末尾。

3. 插入排序:将未排序部分的第一个元素插入到已排序部分的合适位置。

4. 希尔排序:改进的插入排序,将数据分组排序,最终合并排序。

5. 归并排序:将序列拆分成子序列,分别排序后合并,递归完成。

6. 快速排序:选定一个基准值,将小于基准值的元素放在左边,大于基准值的元素放在右边,递归排序。

7. 堆排序:将序列构建成一个堆,然后一次将堆顶元素取出并调整堆。

8. 计数排序:统计每个元素出现的次数,再按照元素大小输出。

9. 桶排序:将数据分到一个或多个桶中,对每个桶进行排序,最后输出。

10. 基数排序:按照元素的位数从低到高进行排序,每次排序只考虑一位。

以上是十大经典排序算法,每个算法都有其优缺点和适用场景,选择合适的算法可以提高排序效率。

10大排序方法

10大排序方法

10大排序方法10大排序方法在计算机科学和数据处理中,排序是一项基础且重要的任务。

通过排序,我们可以将一组数据按照特定规则进行排列,使得数据更易于查找和分析。

下面介绍了10种常用的排序方法,它们在不同场景下具有不同的优势和适用性。

1. 冒泡排序(Bubble Sort)冒泡排序是一种简单而直观的排序算法,它通过重复地比较相邻元素并交换位置来实现排序。

该算法的核心思想是将较大的元素逐渐“冒泡”到数列的末尾。

2. 选择排序(Selection Sort)选择排序的思想是从待排序的数据中选择出最小(或最大)的元素,放在已排序序列的末尾。

该过程不断重复,直到所有元素排序完成。

3. 插入排序(Insertion Sort)插入排序是一种简单且高效的排序算法,它的基本思想是将待排序数据分为已排序和未排序两部分,每次从未排序数据中取出一个元素,将其插入到已排序数据的合适位置。

希尔排序是插入排序的改进版本,它通过使用不同的间隔序列对数据进行多次分组排序,最终实现整体有序。

希尔排序在处理中等大小的数据集时具有较好的性能。

5. 归并排序(Merge Sort)归并排序是一种分治法的典型应用,它将待排序数据不断地分割成小块,然后逐步合并这些小块,以得到完整的有序序列。

归并排序在处理大规模数据时具有较好的稳定性和效率。

6. 快速排序(Quick Sort)快速排序是一种高效的排序算法,它采用分治的思想,通过选取一个基准元素将数据分为左右两部分,并分别对左右两部分进行排序。

快速排序通常是性能最好的排序算法之一。

7. 堆排序(Heap Sort)堆排序是利用堆这种数据结构的一种排序算法。

它通过建立最大(或最小)堆,并不断从堆顶取出最大(或最小)元素,实现排序的过程。

堆排序在处理大规模数据时具有较好的性能。

8. 计数排序(Counting Sort)计数排序是一种非比较性的排序算法,适用于数据范围较小且取值离散的情况。

计数排序通过统计每个元素出现的次数,从而确定每个元素在有序序列中的位置。

C语言入门必学—10个经典C语言算法

C语言入门必学—10个经典C语言算法

C语言入门必学—10个经典C语言算法C语言是一种广泛使用的编程语言,具有高效、灵活和易学的特点。

它不仅在软件开发中被广泛应用,也是计算机科学专业的必修课。

在学习C语言的过程中,掌握一些经典的算法是非常重要的。

本文将介绍10个经典C语言算法,帮助读者更好地了解和掌握C语言。

一、冒泡排序算法(Bubble Sort)冒泡排序算法是最简单、也是最经典的排序算法之一。

它通过不断比较相邻的元素并交换位置,将最大(或最小)的元素逐渐“冒泡”到数组的最后(或最前)位置。

二、选择排序算法(Selection Sort)选择排序算法是一种简单但低效的排序算法。

它通过不断选择最小(或最大)的元素,并与未排序部分的第一个元素进行交换,将最小(或最大)的元素逐渐交换到数组的前面(或后面)。

三、插入排序算法(Insertion Sort)插入排序算法是一种简单且高效的排序算法。

它通过将数组分为已排序和未排序两个部分,依次将未排序部分的元素插入到已排序部分的合适位置。

四、快速排序算法(Quick Sort)快速排序算法是一种高效的排序算法。

它采用了分治的思想,通过将数组分为较小和较大两部分,并递归地对两部分进行排序,最终达到整个数组有序的目的。

五、归并排序算法(Merge Sort)归并排序算法是一种高效的排序算法。

它采用了分治的思想,将数组一分为二,递归地对两个子数组进行排序,并将结果合并,最终得到有序的数组。

六、二分查找算法(Binary Search)二分查找算法是一种高效的查找算法。

它通过不断将查找范围折半,根据中间元素与目标值的大小关系,缩小查找范围,最终找到目标值所在的位置。

七、递归算法(Recursive Algorithm)递归算法是一种通过自我调用的方式解决问题的算法。

在C语言中,递归算法常用于解决树的遍历、问题分解等情况。

八、斐波那契数列算法(Fibonacci Sequence)斐波那契数列是一列数字,其中每个数字都是前两个数字的和。

c语言经典排序算法(8种-含源代码)

c语言经典排序算法(8种-含源代码)
high = mid-1;
}
else /* 如果中间元素比当前元素小,但前元素要插入到中间元素的右侧 */
{
low = mid+1;
a[high+1] = temp; /* 插入 */
}
}
三.直接插入法
/*直接插入法*/
void InsertionSort(int input[],int len)
{
int i,j,temp;
for (i = 1; i < len; i++)
while((low < high) && (data[low] < mid)) /* 新得到的data[low]肯定小于原来的data[low]即mid */
{
++low;
}
data[high]=data[low]; /* 从low的位置开始往high的方向找,找到比data[high]大的元素,存在data[high]中 */
int low, high, mid;
for (i=1; i<len; i++)
{
temp = a[i];/* 保存但前元素 */
low = 0;
high = i-1;
while (low <= high) /* 在a[low...high]中折半查找有序插入的位置 */
{
int mid;
data[0]=data[low];
mid=data[low];
while(low < high)
{
while((low < high) && (data[high] >= mid))

10种排序法(冒泡、选择、插入、希尔、归并、快速、堆、拓扑、重点

10种排序法(冒泡、选择、插入、希尔、归并、快速、堆、拓扑、重点

各种排序算法总结排序算法有很多,所以在特定情景中使用哪一种算法很重要。

为了选择合适的算法,可以按照建议的顺序考虑以下标准:(1)执行时间(2)存储空间(3)编程工作对于数据量较小的情形,(1)(2)差别不大,主要考虑(3);而对于数据量大的,(1)为首要。

主要排序法有:一、冒泡(Bubble)排序——相邻交换二、选择排序——每次最小/大排在相应的位置三、插入排序——将下一个插入已排好的序列中四、壳(Shell)排序——缩小增量五、归并排序六、快速排序七、堆排序八、拓扑排序九、锦标赛排序十、基数排序一、冒泡(Bubble)排序----------------------------------Code 从小到大排序n个数------------------------------------ void BubbleSortArray({for(int i=1;i{for(int j=0;i{if(a[j]>a[j+1]//比较交换相邻元素{int temp;temp=a[i]; a[j]=a[j+1]; a[j+1]=temp;}}}}-------------------------------------------------Code------------------------------------------------ 效率 O(n²),适用于排序小列表。

二、选择排序----------------------------------Code 从小到大排序n个数-------------------------------- void SelectSortArray({int min_index;for(int i=0;i{min_index=i;for(int j=i+1;j 每次扫描选择最小项if(arr[j]if(min_index!=i//找到最小项交换,即将这一项移到列表中的正确位置{int temp;temp=arr[i]; arr[i]=arr[min_index]; arr[min_index]=temp;}}}-------------------------------------------------Code------------------------------------------------------效率O(n²),适用于排序小的列表。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

希尔排序是D.L.Shell于1959年提出来的一种排序算法,在这之前的算法的时间复杂度为O(n²),希尔排序算法是突破这个时间复杂度的第一批算法之一.
希尔算法基于一种增量序列,将待排序序列分组,分别对每一组进行插入排序。

希尔排序在随机情况下,算法的效率表现很优秀。

回顾之前讲过的插入排序,插入排序在序列元素较少的情况下,序列基本有序的情况下效率较高,希尔排序在插入排序基础上去实现这两种苛刻的要求,也就是使得每一次进行插入排序的待排序序列元素个数较少,并使得整体元素更加有序。

使得待排序序列元素减少,那么可以使用分组,分组的策略是基于增量,可理解为相差固定个数的的元素组成组,分别对每一组进行排序,每一组的元素个数就会减少。

每一组的元素趋于有序,那么整个待排序序列也越来越趋于有序。

我们在说到分组时,提到增量,因为增量关系到要分多少组,这个增量的算法至今没有确切的答案,但是根据行业经验,增量= 数据个数/ 3 + 1.
在进行希尔排序中,这个增量循环调用这个增量计算公式递减,直至增量为1时,对所有元素进行最后一次插入排序。

希尔排序是不稳定的排序算法,希尔排序平均时间复杂度n*log2n,最坏时间复杂度为O(n²)。

下面我们来介绍希尔排序:
待排序序列为:9,1,5,8,3,7,4,6,2,当增量为3时,将待排序序列分为3组:第一组:9,8,4
第二组: 1,3,6
第三组: 5,7,2
分别对每一组进行插入排序,排序后结果为:4,1,2,8,3,5,9,6,7
递减增量为2,再分组:
第一组:4,2,3,9,7
第二组:1,8,4,6
分组对这两组进行排序,排序后结果为: 2,1,3,5,4,6,7,8,9
继续递减增量为1,对整体数据进行一次插入排序,排序结果为:
1,2,3,4,5,6,7,8,9
实现代码为:
void ShellSort(int arr[],int len){
int increasement = len;
do{
//通过算法递减增量
increasement = increasement /3+1;
//获得每一组的第一个元素下标
for(int i =0; i < increasement; i++){
//根据第一个元素下标+增量,遍历每一组元素
for(int j = i + increasement; j < len; j += increasement){ //对当前组进行插入排序
if(arr[j]< arr[j - increasement]){
int temp = arr[j];
int k = j - increasement;
for(; k >= i && temp < arr[k]; k -= increasement){
arr[k + increasement]= arr[k];
}
arr[k + increasement]= temp;
}
}
}
}while(increasement >1);
}
int main(){
int arr[]={9,1,5,8,3,7,4,6,2};
int len =sizeof(arr)/sizeof(int);
//排序前打印
PrintArray(arr, len);
ShellSort(arr, len);
//排序后打印
PrintArray(arr, len);
return EXIT_SUCCESS;
}。

相关文档
最新文档