数据结构 — 排序算法(基础)

1、直接插入排序

/*插入排序*/
void insertion_sort (element arr[], int n) {
	int i,j;
	element next;
	for(i = 1; i<n; i++) {
		/*要插入的元素*/
		next = arr[i];
		/*找要插入元素next的 插入位置*/
		for(j = i-1; j>=0 && next<arr[j]; j--) {
			arr[j+1] = arr[j];
		}
		/*插入*/
		arr[j+1] = next;
	}
}

2、希尔排序(插入)

<span style="font-size:14px;">void shell_sort(element arr[], int n) {
	int i, j;
	int dis = n/2;
	while(dis >= 1) {
		for(i = dis; i<n; i++) {
			element next = arr[i];
			//next如果小,就一直向右移动,否则将next赋值给 该位置的后面一位
			for(j = i - dis; next<arr[j] && j>=0; j = j-dis) {
				arr[j+dis] = arr[j];
			}
			arr[j+dis] = next;
		}
		dis /= 2;
	}
}</span>


3、冒泡排序(交换)

void bubble_sort(element arr[], int n) {
	int i, j;
	for(i = 0; i<n; i++) {
		for(j = 0; j<n-i-1; j++){
			if(arr[j]>arr[j+1]) {
				arr[j] = arr[j] + arr[j+1] - (arr[j+1] = arr[j]);
			}
		}
	}
}



4、快速排序(交换)

/*快速排序(交换)*/
void quick_sork(element arr[] ,int left ,int right) {
	int i, j;
	element pivot, temp;
	
	if(left < right) {
	   //i控制最左边,j控制最右边
		i = left;
		j = right;
		//最左边的元素为参考点
		pivot = arr[left];
		/*
			1.从左边找到第一个大于pivot的元素
			2.从右边找到第一个小于pivot的元素
			3.如果i<j 交换两个值
		*/
		do {
			do
				i++;
			while(arr[i]<pivot);
			
			do 
				j--;
			while(arr[j]>pivot);
			
			if(i<j){
				arr[i] = arr[i] + arr[j] - (arr[j] = arr[i]);
			}
		}while(i < j);
		//将pivot放入位置j
		arr[left] = arr[left] + arr[j] - (arr[j] = arr[left]);
		/*
			现在是左边的元素全部小于 pivot 右面的元素全部大于 pivot
			1.left,j-1
			2.j+1,right
		*/
		quicksork(arr, left, j-1);
		quicksork(arr, j+1, right);
	}
}

5、选择排序

/*选择排序*/
void select_sort(element arr[], int n) {
	int i, j;
	int min;
	for(i = 0; i<n; i++) {
		min = i;
		//找到最小值的下标
		for(j = i+1; j<n; j++) {
			if(arr[min]>arr[j]) {
				min = j;
			}
		}
		//从所有序列中先找到最小的,然后放到第一个位置
		arr[i] = arr[i] + arr[min] - (arr[min] = arr[i]);
	}
}

你可能感兴趣的:(希尔排序,选择排序,快速排序,排序算法,直接插入排序)