希尔排序算法和快速排序算法

希尔排序源代码如下:

#include <stdio.h>
//希尔排序
void shellSort(int a[],int l, int r){  //一次排序同一步长所组成的集合 如a[0],a[5],a[10]...
	int i,j,h;
	for(h=1;h<=(r-1)/9;h=3*h+1); //设置步长为1,4,13,40,121,...序列
	for( ; h>0;h/=3)
		for(i=h;i<=r;i++){
			int j = i;int v = a[i];
			while(j>=h && v<a[j-h]){
				a[j] = a[j-h];j-=h;
			}
			a[j] = v;
		}
}
main(){
	int b[16] = {10,7,12,25,8,9,11,71,82,90,1,14,99,7,456,1};
	int length = sizeof(b)/sizeof(b[0]);
	shellSort(b,0,length-1);
	int i;
	for(i=0;i<length;i++)
		printf("%d ",b[i]);
} 

快速排序原代码如下:

#include <stdio.h>

//int a[16] = {10,7,12,25,8,9,11,71,82,90,1,14,99,7,456,1};
//快速排序子程序
int findPivot(int a[],int i,int j){
	int firstKey = a[i];
	int k;
	for(k=i+1;k<=j;k++)
		if(a[k]>firstKey)
			return k;
		else if(a[k]<firstKey)
			return i;
	return -1;
}

//快速排序子程序
int partition(int a[],int i,int j,int pivot) {
	int l,r;
	do{
		for(l = i;a[l]<pivot;l++);
		for(r = j;a[r]>=pivot;r--);
		if(l < r){
			int t = a[l]; a[l]=a[r];a[r]=t;
		}
	}while(l<=r);
	return l;
}

//快速排序主程序
void quickSort(int a[],int i,int j){
	int pivot; //划分的基准;
	int k ; //关键字大于等于pivot的记录在序列中的起始下标
	int pivotIndex;
	pivotIndex = findPivot(a,i,j);
	if(pivotIndex!=-1){ //递归终止条件
		pivot = a[pivotIndex];
		k = partition(a,i,j,pivot) ;
		quickSort(a,i,k-1);
		quickSort(a,k,j);
	}
} 

//-----------------以上是快速排序的一种实现-------------------// 

//快速排序 改进版
void quick_sort(int s[], int l, int r)
{
    if (l < r)
    {
        int i = l, j = r, x = s[l];
        while (i < j)
        {
            while(i < j && s[j] >= x)
				j--;
            if(i < j)
				s[i++] = s[j];

            while(i < j && s[i] < x)
				i++;
            if(i < j)
				s[j--] = s[i];
        }
        s[i] = x;
        quick_sort(s, l, i - 1);
        quick_sort(s, i + 1, r);
    }
}

main(){
	int b[16] = {10,7,12,25,8,9,11,71,82,90,1,14,99,7,456,1};
	int length = sizeof(b)/sizeof(b[0]);
	quickSort(b,0,length-1);
	int i;
	for(i=0;i<length;i++)
		printf("%d ",b[i]);
} 

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 04:14:43

希尔排序算法和快速排序算法的相关文章

c#冒泡排序算法和快速排序算法

依次比较相邻的两个数,将小数放在前面,大数放在后面. 第1趟: 首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后.至此第一趟结束,将最大的数放到了最后. 第2趟: 仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中

iOS算法(一)快速排序算法

快速排序是当遇到较大数据时,排序快,高效的方法(公司面试时,基本上会被问到...) 该方法的基本思想是: 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. 3.再对左右区间重复第二步,直到各区间只有一个数. 简单地理解就是,找一个基准数(待排序的任意数,一般都是选定首元素),把比小于等于基准数的元素放到基准数的左边,把大于基准数的元素放在基准数的右边.排完之后,在把基准数的左边和右边各看成一个整体,  左边:继续选择基准数把小于

[算法研究]の快速排序算法--javascript实现

快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 时间复杂度最坏的情况下是O(nlogn) .也是相似复杂度下较常用的一种排序 var s = [72 ,6, 57, 88, 60, 42, 83 ,73, 48,57,

基础算法之快速排序算法

快速排序基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 比如序列[6,8,1,4,3,9],选取6为基准数key(不会变的),然后从右往左遍历过去,发现第一个比key小的数3,就把6和3交换位置,序列就变成了[3,8,1,4,6,9] 然后从左往右遍历过去,发现第一个比key大的值8,把8和6交换位置,序列变成[3,6,1,4,8,

【经典算法】快速排序算法

原文地址:http://blog.csdn.net/morewindows/article/details/6684558 作者:MoreWindows 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影.总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序

七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)

 写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.因此排序掌握各种排序算法非常重要.对下面介绍的各个排序,我们假定所有排序的关键字都是整数.对传入函数的参数默认是已经检查好了的.只是简单的描述各个算法并给出了具体实现代码,并未做其他深究探讨. 基础知识: 由于待排序的记录数量不同,使得排序过程中设计的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机随机存储器中进行的排序过程.另一类是外部排序,

排序算法系列——希尔排序

希尔排序同之前介绍的直接插入排序一起属于插入排序的一种.希尔排序算法是按其设计者希尔(Donald Shell)的名字命名,该算法由1959年公布,是插入排序的一种更高效的改进版本.它的作法不是每次一个元素挨一个元素的比较.而是初期选用大跨步(增量较大)间隔比较,使记录跳跃式接近它的排序位置:然后增量缩小:最后增量为 1 ,这样记录移动次数大大减少,提高了排序效率.希尔排序对增量序列的选择没有严格规定. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作

(转) 白话经典算法系列之三 希尔排序的实现(附源代码实现)

链接:http://blog.csdn.net/morewindows/article/details/6668714 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率

Python实现排序算法之快速排序

Python实现排序算法:快速排序.冒泡排序.插入排序.选择排序.堆排序.归并排序和希尔排序 Python实现快速排序 原理 首先选取任意一个数据(通常选取数组的第一个数)作为关键数据,然后将所有比它小的放到它前面,所有比它大的放到它后面,这个过程称为一趟快速排序 快速排序原理图如下: 实现 #coding=utf-8 #python实现快速排序 def quick_sort(li,start,end): if start < end: flag = li[start] print(flag)