冒泡排序 选择排序 插入排序 快速排序 堆排序 希尔排序的C语言实现

平台:VS2019
参考:《大话数据结构》

#include

#define MAXSIZE 10

typedef struct{
	int r[MAXSIZE + 1];          /*r[0]用作哨兵或临时变量*/
	int length;
}SqList;

/*交换*/
void swap(SqList* L,int i,int j) {
	int  temp;
	temp = L->r[i];
	L->r[i] = L->r[j];
	L->r[j] = temp;
}


/*冒泡排序*/
void BubbleSort(SqList* L) {
	int i;
	int j;
	for (i = 1; i < L->length; i++) {
		for (j = L->length; j > i; j--) {
			if (L->r[j] < L->r[j - 1]) {
				swap(L, j, j - 1);
			}
		}
	}
}


/*选择排序*/
void SelectSort(SqList *L) {
	int i, j, min;
	for (i = 1; i < L->length; i++) {
		min = i;
		for (j = L->length; j > i; j--) {
			if (L->r[j] < L->r[min]) {
				min = j;
			}
		}
		swap(L, i, min);
	}
}


/*插入排序*/
void InsertSort(SqList* L) {
	int i, j;
	for (i = 2; i <= L->length; i++) {
		if (L->r[i] < L->r[i - 1]) {
			L->r[0] = L->r[i];
			for (j = i-1; L->r[j] > L->r[0]; j--) {
				L->r[j + 1] = L->r[j];
			}
			L->r[j + 1] = L->r[0];
		}
	}
}


/*希尔排序*/
void ShellSort(SqList* L) {
	int i, j, gap;
	for (gap = L->length / 2; gap > 0; gap = gap / 2) {
		for (i = gap + 1; i <= L->length; i++) {
			if (L->r[i] < L->r[i - gap]) {
				L->r[0] = L->r[i];
				for (j = i - gap; L->r[j] > L->r[0]; j = j - gap) {
					L->r[j + gap] = L->r[j];
				}
				L->r[j + gap] = L->r[0];
			}
		}
	}
}


/*构造大顶堆*/
void HeapAdjust(SqList* L, int s, int m) {
	int temp, j;
	temp = L->r[s];
	for (j = 2 * s; j <= m; j = 2 * j) {
		if (j < m&& L->r[j] < L->r[j + 1]) {
			j++;
		}
		if (temp > L->r[j]) {
			break;
		}
		L->r[s] = L->r[j];
		s = j;
	}
	L->r[s] = temp;
}
/*堆排序*/
void HeapSort(SqList* L) {
	int i;
	for (i = L->length / 2; i > 0; i--) {
		HeapAdjust(L, i, L->length);
	}
	for (i = L->length; i > 1; i--) {
		swap(L, 1, i);
		HeapAdjust(L, 1, i - 1);
	}
}


/*确定枢纽值并排序*/
int Partition(SqList* L, int low, int high) {
	int pivotkey;
	pivotkey = L->r[low];
	while (low < high) {
		while (lowr[high]>pivotkey) {
			high--;
		}
		swap(L, low, high);
		while (low < high && L->r[low] < pivotkey) {
			low++;
		}
		swap(L, low, high);
	}
	return low;
}
void QSort(SqList* L, int low, int high) {
	int pivot;
	if (low < high) {
		pivot = Partition(L, low, high);
		QSort(L, low, pivot - 1);
		QSort(L, pivot + 1, high);
	}
}
/*快速排序*/
void QuickSort(SqList* L) {
	QSort(L, 1, L->length);
}


int main() {
	int i;
	SqList L;
	for (i = 1; i < 11; i++) {
		printf("请输入第%d个数字", i);
		scanf_s("%d", &L.r[i]);
	}
	L.length = 10;
	QuickSort(&L);
	for (i = 1; i < 11; i++) {
		printf("第%d个数字是%d\n", i,L.r[i]);
	}
}

你可能感兴趣的:(c语言,排序算法,数据结构)